ดังนั้น xChaCha20 จึงมีขนาด nonce ที่ใหญ่พอที่จะใช้ nonce แบบสุ่มด้วยคีย์เดียวกันได้อย่างปลอดภัย โดยทั่วไปแล้ว Poly1305 จะใช้บล็อกแรกของเอาต์พุตของรหัสเพื่อสร้าง nonce สำหรับ xChaCha20 จะเป็นศูนย์บล็อกสำหรับ poly1305 key/nonce และข้อมูลที่เหลือจะถูกเข้ารหัสด้วยบล็อก 1 ขึ้นไป ดังนั้นหากมีใครส่งข้อความ คุณจะได้รับบางสิ่งตามบรรทัดเหล่านี้ (ลำดับอาจแตกต่างกันไปขึ้นอยู่กับโปรโตคอล):
$$\text{Msg} = \{ \text{แท็ก Poly1305}\} \mathbin\| \{\text{24 ไบต์ Nonce} \} \mathbin\| \{ \text{ข้อมูลที่เกี่ยวข้อง} \}\mathbin\| \{\text{ข้อความรหัส} \}$$
ด้วยเลย์เอาต์นี้ การส่งและสร้าง nonce ใหม่ดูเหมือนเป็นการสิ้นเปลืองเล็กน้อยกับทุกๆ ข้อความ เช่น โอเวอร์เฮดแพ็กเก็ต/ข้อความ 24 ไบต์ และเวลา CPU สร้าง nonce แบบสุ่ม โดยเฉพาะอย่างยิ่งเนื่องจาก xChaCha20 สามารถส่ง $2^{64}$ บล็อกด้วยคีย์เดียวและไม่มีคู่ เราสามารถส่ง nonce ครั้งเดียวแล้วเริ่มส่งกระแสข้อมูลและในข้อความสุดท้ายส่งแท็ก poly1305 อย่างไรก็ตาม หากเป็นข้อมูลจำนวนมากที่ต้องรอให้มีการส่งทั้งหมดก่อนที่จะตรวจสอบว่าแท็ก poly1305 นั้นมีปัญหามากมาย ดูเหมือนว่าจะเป็นประโยชน์มากกว่าในการสร้างแท็ก Poly1305 ในขณะที่คุณใช้งาน
อย่างไรก็ตาม โครงสร้างเกือบทั้งหมดที่ฉันเห็นว่าใช้เฉพาะบล็อก 0 สำหรับคีย์ Poly1305/nonce ดูเหมือนว่าสมเหตุสมผลอย่างยิ่งสำหรับฉันที่จะใช้ตัวนับบล็อกอื่นสำหรับคีย์ Poly1305 ตัวอย่างเช่น สมมติว่ามีคนต้องการส่งข้อมูลจำนวนมาก เพื่อจุดประสงค์ในการอธิบาย ลองพิจารณาโครงสร้างคร่าวๆ ที่ส่ง 7 xChaCha20 บล็อกต่อครั้ง:
ตอนนี้คำถามของฉันคือ ทำไมฉันไม่เห็นมีการก่อสร้างตามแนวนี้เลย มีบางอย่างที่ฉันมองข้ามไป หรือ xChaCha20 ใหม่เกินไป หรือนี่เป็นปัญหาเฉพาะกลุ่ม หรือฉันดูไม่ละเอียดพอ? เนื่องจากโครงสร้างบางส่วนตามบรรทัดเหล่านี้ช่วยให้สามารถตรวจสอบข้อมูลที่ได้รับและยังหลีกเลี่ยงการสร้าง nonce ใหม่จำนวนมากและต้องส่งซ้ำเพื่อเพิ่มข้อความเหนือศีรษะ
แก้ไข:
น่าจะมีความชัดเจนมากขึ้นที่นี่ poly1305_tag(block_x) ควรจะมีทั้งไซเฟอร์เท็กซ์และข้อมูลที่เกี่ยวข้อง ภาพด้านบนเริ่มกว้างขึ้นแล้วสำหรับบางอย่างเช่น
$$poly1305_{tag}(block_x, \text{associated data} \mathbin\| ciphertext).$$
คล้ายกับที่กล่าวไว้ในหมายเหตุด้านล่างที่ xChaCha20_x() รวมถึงคีย์และ nonce ส่วนใหญ่เป็นคำถามเกี่ยวกับการใช้ตัวนับบล็อกอื่นที่ไม่ใช่ศูนย์เพื่อเป็นคีย์สำหรับ poly1305 เพื่อสร้างแท็กหลายรายการสำหรับสตรีมข้อมูลที่ยาวขึ้น