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