Điểm:1

Có cách trực tuyến nào để sử dụng mật mã khối để tạo $n$ bit duy nhất đảm bảo không bị va chạm trong $2^n$ lần không?

lá cờ in

$n$ là một biến thời gian chạy được chọn mỗi khi người dùng chạy triển khai.

Một cách tôi có thể nghĩ là sử dụng bất kỳ mật mã khối nào, chẳng hạn như AES, làm CSPRNG được gieo hạt để xáo trộn danh sách số một cách ngẫu nhiên $0, 1, \ldots, 2^n-1$. Bằng cách này, tôi đảm bảo không va chạm lên đến $2^n$ con số. Nhưng phương pháp này quá tốn kém vì nó sẽ yêu cầu tôi trao đổi $2^n$ con số.

Một cách khác tôi có thể nghĩ đến là sử dụng mật mã khối để tạo bản mã $c = \mathrm{enc}(\mathrm{0x000}\ldots, \mathrm{key})$, ở đâu $\mathrm{len}(c) \ge n$. Sau đó lấy số 1 $n$ nhiều bit của $c$; hãy gọi nó $c_n$. Sau đó làm: $c_n \oplus 0, c_n \oplus 1, \ldots, c_n \oplus 2^n-1$. Cách này hiệu quả, nhưng vấn đề là, tôi nghĩ, chuỗi không ngẫu nhiên. Ví dụ. $c_n \oplus 0$ nói chung là sẽ gần hơn với $c_n \oplus 1$ hơn, nói, $c_n \ocộng thêm 100$.

Câu hỏi: Có cách tiếp cận nào nhanh hơn không, trong đó tôi có thể sử dụng bất kỳ mật mã khối nào chỉ trong khoảng một lần, để tạo số tiếp theo, sao cho khi tôi lặp lại quy trình, tôi nhận được $2^n$ nhiều số duy nhất mà không có xung đột?

Theo một nghĩa nào đó, tôi đoán tôi có thể gọi nó là: một phiên bản trực tuyến của việc xáo trộn các con số $0, 1, \ldots, 2^n-1$, mà không cần duy trì danh sách trong bộ nhớ $2^n$ Dài.

Lý tưởng nhất là nếu tìm thấy xáo trộn trực tuyến hoàn hảo thì nó phải có phân phối này (trong đó $i$ là bất kỳ số nào trong $\{0, 1, \ldots, 2^n-1\}$$N_j$ là một biến ngẫu nhiên sẽ nhận giá trị của một số trong tập hợp đó trong $j^{th}$ cuộc gọi của trình xáo trộn trực tuyến lý tưởng):

$$\begin{split} \Pr(N_0 = i) &= 1/2^n \ \Pr(N_1 = i) &= 1/(2^n - 1) \ \Pr(N_2 = i) &= 1/(2^n - 2) \ \vchấm & \ \Pr(N_{2^n-1} = i) &= 1/(2^n - (2^n-1)) = 1\ \end{split}$$

fgrieu avatar
lá cờ ng
Có một số yêu cầu không được đáp ứng bởi phương pháp cổ điển: mã hóa bộ đếm $n$-bit bằng mật mã khối $n$-bit? Nếu vậy, xin vui lòng cho biết nó.
caveman avatar
lá cờ in
@fgrieu - Không chắc (tôi đoán đó chỉ là sự thiếu hiểu biết). $n$ trong trường hợp của tôi là biến (được xác định tại thời điểm chạy bởi người dùng). Tôi không nghĩ ra. ChaCha20 có phải là một thuật toán như vậy không, trong đó tôi có thể chỉ định kích thước khối tùy ý trong thời gian chạy và có tác dụng như trên?
Maarten Bodewes avatar
lá cờ in
Vâng, tôi nghĩ rằng luồng khóa được tạo bởi chế độ bộ đếm sẽ hoàn toàn phù hợp với vấn đề này. Nếu bạn chỉ có mã hóa thì nó được xác định bằng mã hóa chế độ CTR của các khối hoàn toàn bằng không.
caveman avatar
lá cờ in
@MaartenBodewes - Thật thú vị. Vì ChaCha20 bên trong có các khối 512 byte (ít nhất là cách được triển khai thông thường, ví dụ:`libsodium`'s), liệu có thể tối ưu hóa triển khai cho $n
fgrieu avatar
lá cờ ng
À, vậy yêu cầu còn thiếu là biến $n$ trong thời gian chạy, yêu cầu này buộc phải sử dụng các kỹ thuật Mã hóa dự trữ định dạng. Vui lòng thêm điều đó vào câu hỏi, một phạm vi cho $n$ ($n$ quá lớn không có ý nghĩa gì, vì xung đột giữa các giá trị ngẫu nhiên thống nhất độc lập của bit $n\ge256$ dù sao cũng không thể quan sát được); và có lẽ bất kỳ giới hạn nào có thể có đối với số lượng giá trị $n$-bit mà kẻ thù có thể nhận được cho một chuỗi/khóa nhất định. Lưu ý: ChaCha20 không phải là mật mã khối, chiều rộng khối thay đổi ít hơn nhiều nếu cần, nhưng nó có thể được sử dụng làm khối xây dựng cho một khối.
caveman avatar
lá cờ in
@fgrieu - Cảm ơn! Lạc đề: nếu tôi dùng ChaCha20, liệu 512 có thể rút gọn mà không thay đổi kết quả không (nếu $n
Điểm:3
lá cờ my

Có những cách trực tuyến nào để sử dụng mật mã khối để tạo mã duy nhất $n$ các bit đảm bảo không va chạm cho $2^n$ lần?

Cách rõ ràng để làm điều này là chọn một Mã hóa bảo toàn định dạng chế độ mật mã khối của bạn, giả sử, FF1. Đó là chế độ lấy khối độ dài tùy ý (trong trường hợp của bạn, $n$ chút ít); bạn sẽ chèn khóa và mã hóa bộ đếm. Với một khóa cố định (và nonce), mã hóa không thể đảo ngược và có đầu ra có cùng độ dài với đầu vào - cung cấp cho bạn chính xác những gì bạn đang yêu cầu.

Nhược điểm duy nhất tôi có thể thấy là FF1 có thể có vấn đề về bảo mật đối với các khối thực sự nhỏ (trong trường hợp của bạn, $n \le 6$). Tất nhiên, nếu người dùng yêu cầu một chút $n$, bạn có thể quay lại 'hoán vị các giá trị từ 0 thành $2^n-1$ chiến lược...)

Đă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.