สถานการณ์
ใช้ AES 256 กับโหมด CBC (การตรวจสอบสิทธิ์ทำแยกกัน ละเว้นที่นี่)
เป้าหมาย (อธิบายเพิ่มเติมในภายหลัง)
เพื่อหลีกเลี่ยงการส่ง IV ที่ไม่ได้เข้ารหัส
แต่เนื่องจากการดำเนินการนี้ดำเนินการโดยใช้ .NET ซึ่งฟังก์ชันบังคับให้เราใช้ IV เราจึงไม่สามารถเพิ่ม 16 ไบต์แบบสุ่มขึ้นมาก่อนแล้วทิ้ง 16 ไบต์แรกหลังการถอดรหัส
แผนการ
เติม 16 ไบต์แบบสุ่ม ("IV1") และนอกจากนั้นให้ใช้ 16 ไบต์โดยมีค่าเป็นศูนย์เป็น IV ("IV0") จากนั้นส่งข้อความไซเฟอร์เท็กซ์โดยไม่มี 16 ไบต์แรก
การถอดรหัสจะทำโดยผู้รับก่อนกำหนดว่าบล็อกแรกของอะไร ไซเฟอร์เท็กซ์ จะเป็น (สำหรับคีย์ AES นั้น สำหรับข้อความใดๆ) โดยการเข้ารหัสบางอย่างในลักษณะดังกล่าวข้างต้น (ซึ่งจะต้องทำเพียงครั้งเดียวต่อคีย์) และรับ 16 ไบต์แรกของข้อความไซเฟอร์ที่เป็นผลลัพธ์
จากนั้นพวกเขาเติมไบต์เหล่านั้นต่อท้ายข้อความที่ครอบตัดเพื่อรับข้อความเข้ารหัสดั้งเดิมที่ไม่ได้ครอบตัดแล้วถอดรหัสด้วย IV ("IV0") จำนวน 16 ไบต์ที่มีค่าเป็นศูนย์ (เช่น พวกเขาใช้ฟังก์ชันการถอดรหัสของ .NET โดยป้อน IV ที่จำเป็นซึ่งก็คือศูนย์ 16 ตัวเหล่านั้น)
จากนั้นพวกเขาจะละทิ้ง 16 ไบต์แรกของผลลัพธ์ (ซึ่งได้รับจาก .NET หลังจาก .NET ละทิ้ง 16 ไบต์แรกซึ่งเป็น IV) เนื่องจากเป็น 16 ไบต์สุ่มที่เพิ่มเข้ามา ("IV1").
แต่ทำไม?
การสื่อสาร IV ในรูปแบบข้อความล้วนทำให้ผู้โจมตีที่ดุร้ายมีข้อได้เปรียบ - พวกเขาสามารถถอดรหัสได้เพียงบล็อกเดียว (16 ไบต์) และเปรียบเทียบกับ IV เพื่อตรวจสอบว่าคีย์นั้นถูกต้องหรือไม่ (บางทีอาจมีช่องทางการโจมตีมากกว่านี้ซึ่งฉันไม่รู้)
ดังนั้นคำถามของฉันคือ
แผนนี้ดูเหมือนจะดีหรือมีข้อผิดพลาดอยู่บ้าง?