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

การเข้ารหัสและถอดรหัสข้อมูลในอัลกอริทึม Blowfish

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

กระบวนการเข้ารหัส

  1. แบ่ง 64 บิต → xL, xR (32 บิตต่อครึ่ง)
  2. For i = 1 to 16:
    • xL = xL ⊕ Pᵢ
    • xR = F(xL) ⊕ xR
    • Swap xL, xR
  3. หลังรอบ 16: Swap กลับ (Undo last swap)
  4. xR = xR ⊕ P17, xL = xL ⊕ P18
  5. รวม 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) - จุดสำคัญที่สุด

  1. Init P-array และ S-boxes ด้วยหลักฐาน Pi (Hex digits of π)
  2. XOR P-array กับกุญแจ (วนซ้ำจนครบ P1-P18)
  3. เข้ารหัส All-Zero (64 บิต 0) ด้วย P, S ปัจจุบัน → ได้ 64 บิต
  4. แทนที่ P1, P2 ด้วยผลลัพธ์
  5. เข้ารหัสผลลัพธ์ก่อนหน้า → แทนที่ P3, P4
  6. ทำซ้ำจนครบ 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 ที่ช้าเป็นข้อได้เปรียบ)