Điểm:0

Nonce trong chacha20poly1305 so với chacha20

lá cờ cn

Tôi hiện đang làm việc để thay thế mã hóa chacha20 trong ứng dụng của mình bằng chacha20poly1305, nhưng tôi đang gặp phải một số câu hỏi mà dường như tôi không thể tìm ra câu trả lời rõ ràng, chủ yếu xuất phát từ Rust chacha20poly1305 thùng:

  • Tại sao chacha20poly1305 thùng yêu cầu một nonce cho mỗi tin nhắn, nhưng chacha20 chỉ yêu cầu một nonce duy nhất khi khởi tạo mật mã? Tại sao điều này dường như không xảy ra với các thư viện khác, chẳng hạn như của Python PyCryptodome?
  • Thuật toán ChaCha20Poly1305 có yêu cầu một nonce mới cho mỗi tin nhắn không?
  • Tôi đã hiểu rằng thuật toán ChaCha20 có một bộ đếm bên trong mà nó kết hợp với khóa và nonce để tạo ra các khối của dòng khóa (một khối cho mỗi lần tăng của bộ đếm). Đây không phải là trường hợp khi nó được sử dụng trong ChaCha20Poly1305 sao?

Cuối cùng, nếu ChaCha20Poly1305 (hoặc trong trường hợp của tôi là XChaCha20Poly1305) cần một nonce mới cho mỗi tin nhắn, thì bộ đếm 4 byte cho mỗi tin nhắn kết hợp với nonce ngẫu nhiên 20 byte mỗi phiên có phù hợp để sử dụng làm nonce cho mỗi tin nhắn không ? (khóa được lấy từ mật khẩu và do đó có khả năng lặp lại giữa các phiên và bằng cách nào đó, việc lưu trữ một bộ đếm chung trên tất cả các phiên là không khả thi.)

Cảm ơn!

kelalaka avatar
lá cờ in
Mỗi mật mã luồng chỉ được sử dụng cặp (nonce,key) một lần. Người ta không thể chịu trách nhiệm về những lựa chọn tồi tệ hoặc những hiểu lầm của bạn về điều này.
kelalaka avatar
lá cờ in
Tôi sợ rằng câu hỏi này liên quan nhiều hơn đến phân tích bảo mật của việc triển khai Rust.`khởi tạo mật mã?` là một lựa chọn thư viện. Một thư viện tốt phải xử lý tất cả một cách liền mạch và cung cấp sức mạnh cho người dùng thông qua các tùy chọn. Ví dụ: người ta có thể tạo IV ngẫu nhiên nếu không được cung cấp hoặc lấy IV từ người dùng, v.v.
Keegan Conlee avatar
lá cờ cn
@kelalaka Thế còn điều này thì sao: có chính xác không khi nói rằng trong mật mã ChaCha20Poly1305, bộ đếm của mật mã ChaCha20 nội bộ được đặt lại cho mọi tin nhắn? Điều này sẽ giải thích việc cần một nonce duy nhất cho mỗi tin nhắn, trái ngược với ChaCha20 đơn giản bắt đầu dòng khóa cho mỗi tin nhắn mới ở bất kỳ nơi nào tin nhắn cuối cùng bị bỏ dở.
kelalaka avatar
lá cờ in
Thông thường khi bạn khởi tạo mật mã, có thể bạn quên khởi tạo trong ChaCha20?
Keegan Conlee avatar
lá cờ cn
@kelalaka nó làm gì? Sự hiểu biết của tôi sau khi tìm thêm một số tài liệu là, ít nhất là đối với các thư viện tôi đang sử dụng, khi bạn khởi tạo mật mã ChaCha20, bạn cung cấp khóa và nonce. Đối tượng mật mã sẽ giữ trạng thái (bộ đếm bên trong), tăng bộ đếm khi cần. Trong khi đó, khi bạn khởi tạo mật mã ChaCha20Poly1305, bạn chỉ cung cấp cho nó khóa vì nó không giữ trạng thái nào khác ngoài trạng thái đó, khởi động lại bộ đếm bên trong (và dòng khóa) cho mọi thông báo mới mà bạn muốn mã hóa và do đó yêu cầu một vectơ khởi tạo mới (mà là một nonce mới có cùng khóa).
SAI Peregrinus avatar
lá cờ si
API thư viện khác nhau.Cả ChaCha20 và ChaCha20-Poly1305 đều cần một nonce mới cho mỗi tin nhắn để cung cấp bất kỳ bảo mật nào. Một số thư viện sẽ tự tạo các nonce mới cho bạn từ một nonce đầu vào được cung cấp duy nhất, một số khác thì không. Nói chung, các thùng thực hiện các đặc điểm `mã hóa` ở cấp độ thấp hơn so với các thùng thực hiện các đặc điểm `aead`.
SAI Peregrinus avatar
lá cờ si
Ngoài ra thùng chacha20poly1305 cho phép bạn sử dụng xChaCha20-Poly1305. Điều đó cho phép một nonce ngẫu nhiên, nếu bạn sử dụng toàn bộ 192 bit không gian nonce. Bằng cách đó, bạn không phải lưu trữ bất cứ thứ gì giữa các tin nhắn. Bộ đếm tin nhắn được xử lý nội bộ.
Keegan Conlee avatar
lá cờ cn
Tuy nhiên, @SAIPeregrinus dường như không có bộ đếm tin nhắn, do đó có bài đăng này. Nó yêu cầu bạn chuyển một nonce với mọi lệnh gọi `encrypt()` và không chấp nhận một nonce khi khởi tạo một đối tượng `XChaCha20Poly1305` mới. Trừ khi tôi hoàn toàn thiếu một đoạn lớn API của nó.
Keegan Conlee avatar
lá cờ cn
Tôi đã xem mã nguồn của thùng `chacha20poly1305` và nó thực sự chỉ khởi tạo một mật mã hoàn toàn mới cho mọi lệnh gọi mã hóa(): https://docs.rs/chacha20poly1305/latest/src/chacha20poly1305/lib.rs .html#271 Tôi chỉ có thể cho rằng điều này có nghĩa là tôi cần theo dõi bộ đếm tin nhắn của riêng mình.
SAI Peregrinus avatar
lá cờ si
crypt() được gọi một lần cho mỗi tin nhắn, với một nonce mới mỗi lần. Bộ đếm trong ChaCha không phải là bộ đếm tin nhắn, nó là bộ đếm bên trong được tăng lên cho mỗi 512 bit của tin nhắn.

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