Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

การสร้างกุญแจย่อยในอัลกอริทึม Blowfish

Key Expansion ของ Blowfish

จุดเด่นที่สุด: สร้าง Subkeys จำนวนมาก (1042 × 32 บิต = 4168 ไบต์) จากกุญแจ 32-448 บิต

โครงสร้าง Subkeys

  • P-array: P1-P18 (18 × 32 บิต) - ใช้ในรอบ Feistel
  • S-boxes: 4 ตัว × 256 entries × 32 บิต = 4096 ค่า - ใช้ใน F-function

ขั้นตอน Key Expansion

  1. Initialize: เติม P1-P18 และ S1-S4 ด้วยหลักฐาน Pi (Hex digits of π)
    P1=0x243F6A88, P2=0x85A308D3, P3=0x13198A2E, P4=0x03707344, ...
  2. XOR with Key: XOR P1-P18 กับกุญแจ (วนซ้ำจนครบ 18 ค่า)
    เช่น กุญแจ 128 บิต = K1||K2||K3||K4 → P1⊕K1, P2⊕K2, P3⊕K3, P4⊕K4, P5⊕K1, ...
  3. Encrypt All-Zero: เข้ารหัส 64 บิต 0 ด้วย P, S ปัจจุบัน
  4. Replace P1,P2: ผลลัพธ์ 64 บิต → P1 (32 บิตซ้าย), P2 (32 บิตขวา)
  5. Iterate: เข้ารหัสผลลัพธ์ล่าสุด → แทนที่ P3,P4 → P5,P6 ... จนครบ P18
  6. Continue for S-boxes: ทำต่อ S1[0]-S1[255], S2[0]... S4[255]

รวม 521 รอบการเข้ารหัส เพื่อสร้าง Subkeys ทั้งหมด

คุณสมบัติ

  • Key-dependent S-boxes: S-boxes เปลี่ยนตามกุญแจ → ทน Related-Key Attacks
  • ช้าโดยเจตนา: ป้องกัน Brute-force กุญแจสั้น (ใช้ใน bcrypt)
  • Deterministic: กุญแจเดียวกัน → Subkeys เดียวกันเสมอ
  • แอปพลิเคชันควร Cache Subkeys ไม่ควรทำ Key Expansion ทุกครั้ง

Weak Keys

มีกุญแจบางค่าทำให้ S-boxes มีคุณสมบัติแย่ (เช่นค่าซ้ำมาก) แต่โอกาสน้อยมาก หากกังวล ให้ทดสอบหลัง Key Expansion