Điểm:0

Liệt kê các giá trị từ một trình tạo đồng dư tuyến tính java Random()

lá cờ mx

Trong quá trình nghiên cứu về một ứng dụng java, tôi phát hiện ra rằng nextInt(64) chức năng của java.Random() class được sử dụng để tạo khóa mã hóa.

Kích thước khóa là 16 byte. Tôi biết rằng trình tạo này không được khuyến nghị vì nó dễ bị tổn thương. Đặc biệt trong trường hợp này, giá trị của mỗi byte của khóa được chọn từ một phạm vi ngắn từ 0x0 đến 0x40.

Tôi đã làm quen với thực tế là có thể dự đoán các giá trị tiếp theo ââcủa trình tạo sử dụng các giá trị trước đó. Nhưng trong trường hợp của tôi, meyan không có dữ liệu về các giá trị trước đó (Khóa được mã hóa và tôi không có quyền truy cập vào các giá trị của nó), vì vậy ở đây chúng ta đang nói về việc lặp lại các giá trị chính. Tôi không hiểu làm cách nào tôi có thể sử dụng dữ liệu mà mỗi giá trị tiếp theo phụ thuộc vào giá trị trước đó (tham số oldseed)?

protected int next(int bits) {
        hạt cũ dài, hạt tiếp theo;
        AtomicLong seed = this.seed;
        làm {
            oldseed = seed.get();
            nextseed = (oldseed * multiplier + addend) & mask;
        } while (!seed.compareAndSet(oldseed, nextseed));
        return (int)(nextseed >>> (48 - bit));
}

Làm cách nào để giảm số lần liệt kê cho khóa 16 byte như vậy?

fgrieu avatar
lá cờ ng
Có phải 16 byte thu được với next(6) có nghĩa là bạn đang sử dụng " từ 0x0 đến 0x40" có nghĩa là trong [0, 0x40-1]? Sau đó, gợi ý: giả sử một luồng duy nhất trong quá trình tạo khóa và đơn giản hóa tương ứng những gì mã này thực hiện. Sau đó, tìm bit nào của hạt giống có ảnh hưởng đến khóa 16 byte.Kết luận có thể có bao nhiêu khóa 16 byte như vậy và cách liệt kê chúng. Có lẽ, hãy điều tra cách chọn hạt giống, điều này có thể cho phép liệt kê khóa thực tế nhanh hơn nhiều.
Sergey Unk avatar
lá cờ mx
@fgrieu không có next(6) - nextInt(64) được sử dụng. Điều này có nghĩa là mỗi byte của khóa 16 chữ số là một số trong phạm vi [0;63] (hệ thập phân)
fgrieu avatar
lá cờ ng
Điều đó rõ ràng hơn và bao gồm các byte chính từ 0x0 đến 0x3F. Các gợi ý đã sửa đổi dựa trên nội dung trên: hiểu cách `nextInt(64)` sử dụng `next(31)` và tại sao `nextInt(64)` lại chính xác tương đương với `next(6)`. Sau đó, giả sử một luồng duy nhất trong quá trình tạo khóa và đơn giản hóa mã của câu hỏi cho phù hợp. Tìm bit nào của hạt giống có ảnh hưởng đến khóa 16 byte. Kết luận có thể có bao nhiêu khóa 16 byte như vậy và cách liệt kê tất cả chúng với chi phí khả thi. Có lẽ, hãy điều tra cách chọn hạt giống, điều này có thể cho phép liệt kê khóa thực tế nhanh hơn nhiều.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.