CBC Mode คืออะไร?
Cipher Block Chaining (CBC) เป็นโหมดการทำงานของ Block Cipher (เช่น AES, DES) ที่นำ Ciphertext Block ก่อนหน้า มา XOR กับ Plaintext Block ปัจจุบัน ก่อนเข้ารหัส ทำให้ Block เดียวกันที่อยู่ตำแหน่งต่างกัน ให้ Ciphertext ต่างกันทุกครั้ง — แก้ปัญหา Pattern Leakage ของ ECB Mode
กระบวนการเข้ารหัส CBC (Encryption)
- สร้าง Initialization Vector (IV) แบบสุ่ม (Random) ขนาดเท่ากับ Block Size (16 ไบต์สำหรับ AES)
- Block แรก:
C₁ = Encrypt(P₁ ⊕ IV) - Block ถัดไป:
Cᵢ = Encrypt(Pᵢ ⊕ Cᵢ₋₁) - ส่ง IV + Ciphertext ไปยังผู้รับ (IV ไม่ต้องเป็นความลับ แต่ต้องไม่ซ้ำ/คาดเดาไม่ได้)
กระบวนการถอดรหัส CBC (Decryption)
- Block แรก:
P₁ = Decrypt(C₁) ⊕ IV - Block ถัดไป:
Pᵢ = Decrypt(Cᵢ) ⊕ Cᵢ₋₁ - ข้อสังเกต: Decryption แบบ Parallel ได้ (ต่างจาก Encryption ที่ Sequential)
AES-CBC: การรวม AES กับ CBC Mode
- AES = Block Cipher มาตรฐาน (128/192/256-bit key, 128-bit block)
- CBC = Mode of Operation
- AES-CBC = ใช้ AES เป็น Primitive ภายในโครงสร้าง CBC — ใช้กันอย่างกว้างใน TLS 1.2, IPsec, SSH, File/Full-disk Encryption (BitLocker, FileVault, LUKS)
ข้อดีของ CBC
- ไม่มี Pattern Leakage (เหมือน ECB) — Ciphertext ดูเหมือน Random
- รองรับ Parallel Decryption — เร็วกว่าในการถอดรหัสขนาดใหญ่
- เข้าใจง่าย มาตรฐานเก่า รองรับทุกไลบรารี/ฮาร์ดแวร์
ข้อเสียและช่องโหว่ของ CBC (Critical)
1. Padding Oracle Attack (POODLE, Lucky Thirteen)
หากระบบบอกว่า "Padding ผิด" vs "MAC ผิด" แตกต่างกัน โจมตีสามารถถอดรหัสได้ Byte-by-byte → ต้องใช้ Encrypt-then-MAC (EtM) หรือ AEAD แทน
2. Malleability (Bit-flipping)
โจมตีสามารถพลิกบิตใน Ciphertext → ทำให้ Plaintext เปลี่ยนแปลงได้ตามที่ต้องการ (หรอไม่มี Integrity Check) → ต้องมี Authentication (HMAC/GCM/CCM)
3. IV Reuse / Predictable IV
ใช้ IV ซ้ำหรือคาดเดาได้ → ระบุ Plaintext ได้ → IV ต้อง Random (CSPRNG) ทุกครั้ง
4. ไม่มี Authentication ทางตัวเอง
CBC ให้แค่ Confidentiality — ต้องผูกกับ HMAC (Encrypt-then-MAC) หรือใช้ AEAD (GCM, CCM, ChaCha20-Poly1305)
เปรียบเทียบ CBC vs ECB vs GCM
| คุณสมบัติ | ECB | CBC | GCM (AEAD) |
|---|---|---|---|
| Pattern Leakage | มี (อันตราย) | ไม่มี | ไม่มี |
| Parallel Encrypt | ได้ | ไม่ได้ (Sequential) | ได้ |
| Parallel Decrypt | ได้ | ได้ | ได้ |
| Integrity/Auth | ไม่มี | ไม่มี (ต้องเพิ่ม HMAC) | มี built-in |
| Padding | ต้องการ | ต้องการ (PKCS#7) | ไม่ต้องการ |
| สถานะแนะนำ | ห้ามใช้ | Legacy/Compatibility เท่านั้น | แนะนำ (Modern Standard) |
แนวทางปฏิบัติปัจจุบัน (2024+)
- โปรเจกต์ใหม่: ใช้ AES-GCM หรือ ChaCha20-Poly1305 (AEAD) — เร็วกว่า ปลอดภัยกว่า ไม่ต้องจัดการ Padding/IV เอง
- ระบบ Legacy (TLS 1.2, IPsec, Disk Encryption): AES-CBC ยังคงใช้งานได้ หาก ใช้ Encrypt-then-MAC (RFC 7366) IV Random และจัดการ Key ให้ถูกต้อง
- ห้ามใช้: CBC แบบ Raw (ไม่มี MAC), IV คงที่/เป็นศูนย์, Padding แบบไม่ตรวจสอบ
CBC-MAC และ CMAC
CBC-MAC ใช้โครงสร้าง CBC สร้าง Message Authentication Code — แต่ ไม่ปลอดภัยสำหรับข้อความความยาวแปรผัน (Length Extension Attack) → ใช้ CMAC (NIST SP 800-38B) หรือ HMAC แทน
สรุป
CBC เป็นโหมด Block Cipher ที่สำคัญทางประวัติศาสตร์ และยังใช้อยู่ในระบบ Legacy มากมาย แต่สำหรับการพัฒนาใหม่ ควรใช้ AEAD (AES-GCM, ChaCha20-Poly1305) ที่ให้ Confidentiality + Integrity + Authenticity ในขั้นตอนเดียว ลดโอกาสผิดพลาดในการ Implement อย่างมาก