ด้วยเหตุผลด้านระบบเดิม ระบบของฉันไม่มีตัวเลือกในการใช้โหมด AEAD เราจึงถูกจำกัดไว้ที่ AES ในโหมด CBC หรือ CTR ธรรมดา บวกกับ MAC
งานทั่วไปคือการถ่ายโอนข้อมูลจากโหนดหนึ่งไปยังอีกโหนดหนึ่งในขณะที่รับประกันความสมบูรณ์และการรักษาความลับ ฉันพบว่าตัวเองระบุองค์ประกอบต่อไปนี้ซ้ำแล้วซ้ำอีก:
- CSPRNG เพื่อสร้างความลับของบูตสแตรป
- KDF เพื่อรับคีย์สำหรับการเข้ารหัสและ MAC - ฉันใช้ HKDF
- CSPRNG อีกครั้งได้รับ iv
- โหมด CTR เพื่อเข้ารหัสข้อมูล
- MAC ผ่าน bootstrap secret, iv, cipherspec และ ciphertext - ฉันใช้ HMAC
ดังนั้นฉันจึงทำการเข้ารหัสจากนั้นใช้ MAC และฉันกำลังตรวจสอบอินพุตทั้งหมดเพื่อคำนวณไซเฟอร์เท็กซ์ แต่ฉันคิดว่าองค์ประกอบนี้ปลอดภัย
ฉันไม่เคยเห็นองค์ประกอบเต็มรูปแบบนี้จริง ๆ รวมถึง KDF ที่อธิบายว่าเป็นแบบดั้งเดิมที่ใช้ซ้ำได้
TLS ทำสิ่งที่คล้ายกันมาก แต่ก็ไม่เหมือนกันเสียทีเดียว (เช่น ใช้ HKDF ต่างกัน)
แบบแผน IES เช่น ECIES และ DLIES ดูมีแนวคิดคล้ายกัน แต่แตกต่างกันในรายละเอียด โดยเฉพาะอย่างยิ่งในวิธีการรับอินพุตไปยัง KDF
ดังนั้นคำถามของฉันคือ: ปัญหานี้ไม่ทั่วถึงพอที่จะรับประกันวิธีแก้ปัญหาตำราอาหารหรือไม่? หรืออาจจะมีบางอย่างที่ฉันมองข้ามไป? มิฉะนั้น ฉันจะมั่นใจในวิธีแก้ปัญหาได้อย่างไร (เมื่อพูดถึง crypto ฉันมักจะระมัดระวังอยู่เสมอ)
ในกรณีที่รายละเอียดมีประโยชน์ โฟลว์คือ:
โหนดส่งดำเนินการต่อไปนี้:
- รับ 256 บิตลับ
เมล็ดพันธุ์
จาก CSPRNG
- เข้ารหัส
เมล็ดพันธุ์
สำหรับโหนดอื่นโดยใช้รหัสสาธารณะเป็น encrypted_seed
- แยก
เมล็ดพันธุ์
เป็น 128 บิต เกลือ
และ 128 บิต คีย์_วัสดุ
- รับ 384 บิตลับโดยการโทร
HKDF-HMAC-SHA-256(ความยาว=384b, ikm=key_material, เกลือ=เกลือ, ข้อมูล=<รหัสโหนดต้นทาง || รหัสโหนดปลายทาง>)
- แยกออกเป็น 128 บิต
encryption_key
, 256 บิต HMAC_key
สำหรับแต่ละข้อความที่จะส่ง:
- รับ 128 บิตจาก CSPRNG เป็น
encryption_iv
- เข้ารหัสข้อความธรรมดาโดยใช้
AES-128-CTR(iv=encryption_iv, key=encryption_key)
- คำนวณแท็กเป็น
HMAC-SHA-256(key=HMAC_key, data=encrypted_seed || encryption_iv || cipherspec=AES-128-CTR || ciphertext)
- ส่งไปยังโหนดอื่น:
encrypted_seed || encryption_iv || ไซเฟอร์สเปค || ไซเฟอร์เท็กซ์ || แท็ก
โหนดรับดำเนินการต่อไปนี้:
- แยกข้อความที่ได้รับออกเป็นส่วนประกอบ
encrypted_seed
เป็นต้น
- ถอดรหัส
encrypted_seed
โดยใช้ไพรเวตคีย์ของโหนดรับ เมล็ดพันธุ์
- แยก
เมล็ดพันธุ์
เป็น 128 บิต เกลือ
และ 128 บิต คีย์_วัสดุ
- รับ 384 บิตลับโดยการโทร
HKDF-HMAC-SHA-256(ความยาว=384b, ikm=key_material, เกลือ=เกลือ, ข้อมูล=<รหัสโหนดต้นทาง || รหัสโหนดปลายทาง>)
- แยกออกเป็น 128 บิต
encryption_key
, 256 บิต HMAC_key
- คำนวณแท็กเป็น
HMAC-SHA-256(key=HMAC_key, data=<ข้อความที่ได้รับจากการส่งโหนดโดยไม่มีแท็ก>)
- กำหนด
tag_valid := จริง
หากแท็กตรงกับข้อความที่ได้รับ เท็จ
มิฉะนั้น
- กำหนด
k := encryption_key
ถ้า tag_valid
มิฉะนั้นมอบหมาย k := <ค่าคงที่สุ่มบางตัว>
- ถอดรหัสข้อความเข้ารหัสเป็น
[cipherspec](iv=encryption_iv, คีย์=k)
- ส่งออกทูเพิล
(tag_valid, ข้อความธรรมดา)
- ผู้โทรมีหน้าที่ตรวจสอบ tag_valid
ก่อนใช้ข้อความธรรมดา
แล้วจะเกิดอะไรขึ้น? สำหรับหนึ่ง เมล็ดพันธุ์
ค่าถูกใช้ก่อนที่จะตรวจสอบแท็ก MAC ฉันสามารถเซ็นชื่อโดยใช้คีย์ส่วนตัวของโหนดที่ส่ง แต่นั่นไม่ได้ผูกมัดจริงๆ เมล็ดพันธุ์
ไปยังแท็ก MAC นี่ก็เริ่มจะยุ่งเหยิงแล้ว