Vì vậy, xChaCha20 có kích thước nonce đủ lớn để sử dụng an toàn một nonce ngẫu nhiên với cùng một khóa. Poly1305 thường sử dụng khối đầu ra đầu tiên của mật mã để tạo nonce của nó. Đối với xChaCha20, nó sẽ là khối 0 cho khóa/nonce poly1305 và phần còn lại của dữ liệu sẽ được mã hóa bằng khối 1 trở lên. Vì vậy, nếu một người gửi tin nhắn, bạn sẽ nhận được thứ gì đó dọc theo những dòng này (thứ tự có thể khác tùy thuộc vào giao thức):
$$\text{Msg} = \{ \text{Thẻ Poly1305}\} \mathbin\| \{\text{24 Byte Nonce} \} \mathbin\| \{ \text{Dữ liệu liên kết} \}\mathbin\| \{\text{Văn bản mật mã} \}$$
Bây giờ với bố cục này, có vẻ hơi lãng phí khi gửi và tạo nonce mới với mỗi tin nhắn i.g. Chi phí gói/tin nhắn 24 byte và thời gian CPU tạo nonce ngẫu nhiên. Đặc biệt là vì xChaCha20 có thể gửi $2^{64}$ các khối với một cặp khóa và nonce. Người ta chỉ có thể gửi nonce một lần và sau đó bắt đầu gửi luồng dữ liệu của họ và trên tin nhắn cuối cùng gửi thẻ poly1305. Tuy nhiên, nếu có nhiều dữ liệu phải đợi tất cả dữ liệu được gửi trước khi xác minh thì thẻ poly1305 có một số vấn đề riêng. Việc tạo các thẻ Poly1305 khi bạn thực hiện có vẻ thực tế hơn.
Tuy nhiên, gần như tất cả các cấu trúc mà tôi thấy chỉ sử dụng khối 0 cho khóa/nonce Poly1305, tôi thấy hoàn toàn hợp lý khi sử dụng các bộ đếm khối khác cho khóa Poly1305. Chẳng hạn, giả sử ai đó muốn gửi một luồng dữ liệu dài. Đối với mục đích minh họa, hãy xem xét một số cấu trúc thô gửi 7 khối xChaCha20 cùng một lúc:
Bây giờ, câu hỏi của tôi là tại sao tôi không thấy một công trình dọc theo những dòng này? Có điều gì tôi đang xem xét, hoặc xChaCha20 quá mới hoặc đây là một mối quan tâm khá nhỏ, hoặc tôi đã không tìm kiếm đủ chăm chỉ? Vì một số cấu trúc dọc theo các dòng này cho phép một người xác minh dữ liệu khi họ nhận được và cũng tránh tạo ra nhiều nonce mới và phải liên tục gửi cho họ thêm chi phí tin nhắn.
Chỉnh sửa:
Có lẽ nên rõ ràng hơn ở đây poly1305_tag(block_x) được cho là bao gồm cả bản mã và dữ liệu liên quan. Hình ảnh trên đã trở nên khá rộng đối với một cái gì đó như
$$poly1305_{tag}(block_x, \text{associated data} \mathbin\| ciphertext).$$
Tương tự như được đề cập trong ghi chú bên dưới, xChaCha20_x() bao gồm khóa và nonce. Chủ yếu đây là câu hỏi về việc sử dụng các bộ đếm khối khác ngoài 0 để làm khóa cho poly1305 tạo nhiều thẻ cho luồng dữ liệu dài hơn.