ฉันมีอุปกรณ์ที่ต้องสื่อสารกับโฮสต์อื่นและแลกเปลี่ยนข้อความที่มีความยาวคงที่
การรับส่งข้อมูลทั้งหมดควรได้รับการเข้ารหัสและรับรองความถูกต้อง และควรทนทานต่อการโจมตีซ้ำ น่าเสียดายที่การพึ่งพา TLS ไม่ใช่ทางเลือก ดังนั้นฉันจึงต้องใช้โปรโตคอลที่กำหนดเอง ฉันสามารถควบคุมอุปกรณ์ทั้งสองได้ ดังนั้นฉันจึงสามารถสร้างและแจกจ่ายคีย์ที่ใช้ร่วมกันได้อย่างปลอดภัย $k$.
ฉันคิดว่าจะใช้ AEAD กับ block cypher เพื่อยกของหนัก เช่น AES ในโหมด GCM ปัญหาที่ฉันพบคือการป้องกันการโจมตีซ้ำ และฉันได้แนวคิดต่อไปนี้ มาเรียกอุปกรณ์กันเถอะ $A$ และ $B$ และพิจารณาการติดต่อสื่อสารจาก $A$ ถึง $B$ เท่านั้น.
- $A$ สร้างสตริงแบบสุ่ม $a$ แล้วส่งมาที่ $B$.
- $B$ สร้างสตริงแบบสุ่ม $ข$ แล้วส่งมาที่ $A$.
- ทั้งคู่ $A$ และ $B$ คำนวณ $h=H(k \Vert a \Vert b)$ สำหรับฟังก์ชันแฮชการเข้ารหัสบางอย่าง $H$,และใช้ $h$ เป็นเวกเตอร์เริ่มต้นตัวแรกสำหรับโครงร่าง AEAD
เมื่อไหร่ก็ตาม $A$ ต้องส่งข้อความ $m$ ถึง $B$มันเข้ารหัส $m$ เพื่อให้ได้ไซเฟอร์เท็กซ์ที่สอดคล้องกัน $ค$คำนวณแท็กการรับรองความถูกต้อง $t$และส่ง $c \Vert t$ ถึง $A$ (ข้อความมีความยาวคงที่ดังนั้นความยาวของ $c \Vert t$ มีค่าคงที่) แล้ว $A$ เพิ่มขึ้น $h$ และเริ่มต้นโครงร่าง AEAD อีกครั้งด้วย IV ใหม่ $h$.
กระบวนการถอดรหัสจะคล้ายกัน: $B$ ได้รับ $c \Vert t$ถอดรหัส $ค$ เข้าไปข้างใน $m$ตรวจสอบความถูกต้องของข้อความโดยใช้แท็ก $t$เพิ่มขึ้น $h$และเริ่มต้นโครงร่าง AEAD อีกครั้งด้วยค่าใหม่เป็น $h$.
สื่อสารจาก $B$ ถึง $A$ มีความสมมาตรอย่างสมบูรณ์ ยกเว้นว่า IV เริ่มต้นนั้น $H(k \Vert b \Vert a)$.
มีข้อบกพร่องใด ๆ ที่เห็นได้ชัดกับแนวคิดข้างต้นหรือไม่? ฉันกำลังประดิษฐ์ล้อใหม่หรือไม่? ถ้าเป็นเช่นนั้น แนวทางแก้ไขปัญหานี้คืออะไร?