เหตุผลเดียวที่คุณควรกลัวการใช้ IV ซ้ำคือหากตัวสร้างตัวเลขสุ่มปิดอยู่
สมมติว่า IV แบบสุ่มทั้งหมดคุณสามารถเข้ารหัสได้ $2^{64}$ บล็อก ภายใน AES-CBC และยังมีเพียงหนึ่งใน $~2^{64}$ มีโอกาสเกิดการชนกัน (โดยประมาณ) โปรดทราบว่าปัญหาการป้อนซ้ำไม่ได้จำกัดตัวเองไว้ที่ IV; แต่ละไซเฟอร์เท็กซ์จะถูกใช้เป็น "เวกเตอร์" สำหรับ AES-block-encrypt ถัดไป
แนวคิดของคุณคือการสุ่มบล็อกข้อความธรรมดาเพื่อช่วยต่อต้านการชนกันของ IV ซึ่งเป็นสิ่งที่เกิดขึ้นน้อยกว่าการชนกันในเอาต์พุตของ AES (สมมติว่าข้อความมีขนาดใหญ่กว่าหนึ่งบล็อก) แต่นั่นก็ช่วยไม่ได้จริงๆ เนื่องจากการปะทะกันยังคงเกิดขึ้นได้ และถ้าผู้โจมตีรู้ว่าอะไรอยู่ในข้อความธรรมดาส่วนใหญ่ ก็จะเดาได้ง่ายว่ามีอะไรอยู่ในอีกบล็อกหนึ่ง
อย่างไรก็ตาม ยังมีปัญหาอื่นอีก ตอนนี้ดูเหมือนว่าคุณมีข้อมูลแบบสุ่มเพื่อทำการสุ่มบล็อก หากคุณจะใช้ข้อมูลสุ่มนั้นเพื่อสร้าง IV แบบสุ่มที่ปลอดภัย คุณน่าจะไม่พบปัญหาตั้งแต่แรก
หากคุณต้องการปกป้องข้อมูลของคุณ คุณควรได้รับหรือห่อหุ้มคีย์เฉพาะของข้อความจาก "มาสเตอร์คีย์" ของคุณจะดีกว่า
หากแหล่งที่มาของการสุ่มของคุณไม่ปลอดภัยในการเข้ารหัส คุณอาจประสบปัญหาอยู่ดี คุณสามารถดูโหมด AES-SIV เพื่อลดปัญหาได้บ้าง ในโหมดนั้น IV ขึ้นอยู่กับข้อความธรรมดา
สิ่งที่คุณไม่ควรทำอย่างยิ่งคือการเพิ่มโปรโตคอลของคุณเพื่อพยายามซ่อนข้อบกพร่องของอัลกอริทึม ไม่น่าจะประสบความสำเร็จและจะเพิ่มความซับซ้อนที่ไม่จำเป็นทุกประเภท การเข้ารหัส AES ไม่ควรต้องใช้การเต้นแท็ปใดๆ หากใช้โครงสร้างที่ถูกต้อง
บันทึกความปลอดภัย:
- เพื่อป้องกันการเปลี่ยนแปลงในอนาคต ฉันขอแนะนำให้รวม IV ไว้ในการคำนวณ MAC ด้วย การใช้ MAC บน IV จะเพิ่มเพียง 16 ไบต์ในการคำนวณ ซึ่งค่อนข้างไม่มีนัยสำคัญปัจจุบัน IV ของคุณไม่สามารถเปลี่ยนแปลงได้โดยผู้โจมตี แต่การเปลี่ยนแปลงโปรโตคอลอาจทำให้ IV และข้อความของคุณ เสี่ยงต่อการเปลี่ยนแปลง.
- ฉันขอเตือนคุณด้วยว่าหากข้อมูลเป็นของ MAC แสดงว่าคุณเสี่ยงต่อการถูกโจมตีด้วยการแทนที่: แทนที่ข้อมูลของไฟล์หนึ่งด้วยอีกไฟล์หนึ่ง คุณต้องมีบางสิ่งที่ตรวจสอบได้ / ไม่ซ้ำใครในส่วนหัว / ข้อมูลเมตาและ MAC ร่วมกับข้อความเข้ารหัสของคุณ (เรามีแบบแผน AEAD เพื่อช่วยในเรื่องนั้น)