Blowfish
บล็อกไซเฟอร์แบบสมมาตร พัฒนาโดย Bruce Schneier (1993) บล็อก 64 บิต กุญแจผันผวน 32-448 บิต Public Domain ไม่มีสิทธิบัตร
โครงสร้าง
- Feistel Network 16 รอบ
- แตกต่าง DES: ทั้งสองครึ่งถูกเปลี่ยนแปลงทุกรอบ (DES เปลี่ยนแค่ครึ่งขวา)
- F-function ใช้ S-boxes 4 ตัว (256 entries × 32 บิต) และ P-array 18 ค่า (32 บิต)
- อ็อปเปอเรเตอร์: XOR, Addition mod 2³², Table Lookup
กระบวนการเข้ารหัส
- แบ่ง 64 บิต → xL, xR (32 บิตต่อครึ่ง)
- For i = 1 to 16:
- xL = xL ⊕ Pᵢ
- xR = F(xL) ⊕ xR
- Swap xL, xR
- หลังรอบ 16: Swap กลับ (Undo last swap)
- xR = xR ⊕ P17, xL = xL ⊕ P18
- รวม xL || xR = Ciphertext 64 บิต
F-Function
F(xL) = ((S1[a] + S2[b] mod 2³²) ⊕ S3[c]) + S4[d] mod 2³² where xL = a||b||c||d (แต่ละอัน 8 บิต)
กระบวนการถอดรหัส
อัลกอริทึมเดียวกัน แต่ใช้ P-array ในลำดับย้อนกลับ: P18, P17, ..., P1
การขยายกุญแจ (Key Expansion) - จุดสำคัญที่สุด
- Init P-array และ S-boxes ด้วยหลักฐาน Pi (Hex digits of π)
- XOR P-array กับกุญแจ (วนซ้ำจนครบ P1-P18)
- เข้ารหัส All-Zero (64 บิต 0) ด้วย P, S ปัจจุบัน → ได้ 64 บิต
- แทนที่ P1, P2 ด้วยผลลัพธ์
- เข้ารหัสผลลัพธ์ก่อนหน้า → แทนที่ P3, P4
- ทำซ้ำจนครบ P1-P18 และ S1-S4 ทั้ง 4 ตัว (รวม 521 รอบเข้ารหัส)
จุดแข็ง / จุดอ่อน
- ✅ กุญแจยาวได้ถึง 448 บิต
- ✅ S-boxes ขึ้นกับกุญแจ (Key-dependent) → ทน Related-Key Attacks
- ✅ เร็วในซอฟต์แวร์ 32/64 บิต
- ❌ บล็อก 64 บิต → Sweet32 Attack
- ❌ Key Expansion ช้า (521 รอบ) → ไม่เหมาะสำหรับการเปลี่ยนกุญแจบ่อย
- ❌ มี Weak Keys (S-boxes เกิดคุณสมบัติแย่)
- ❌ Schneier เองแนะนำให้ใช้ Twofish (AES Finalist) หรือ AES แทน
การประยุกต์
- OpenSSL, OpenSSH (Legacy), TrueCrypt/VeraCrypt (Legacy), bcrypt (Password Hashing - ใช้ Key Expansion ที่ช้าเป็นข้อได้เปรียบ)