Block cipher gốc (ECB) mã hóa từng khối độc lập → không an toàn (lộ pattern). Chế độ vận hành thêm IV, chaining, feedback để đạt bảo mật IND-CPA/IND-CCA.
Bảng so sánh các chế độ chính
| Chế độ | IV/Nonce | Mã hóa song song | Giải mã song song | Error Propagation | Xác thực | Trạng thái |
|---|---|---|---|---|---|---|
| ECB | Không | Có | Có | Không | Không | CẤM DÙNG (dữ liệu >1 khối) |
| CBC | Random IV | Không | Có | 1 block lỗi → 2 block plaintext sai | Không (cần HMAC riêng) | Legacy, TLS 1.2, disk encryption (XTS tốt hơn) |
| CTR | Nonce + Counter | Có | Có | Không (bit error → bit error) | Không (cần HMAC riêng) | Tốt, biến block→stream, dùng trong GCM/CCM |
| OFB | Random IV | Không | Không | Không | Không | Ít dùng, keystream độc lập plaintext |
| CFB | Random IV | Không | Không | 1 block lỗi → 2 block plaintext sai | Không | Legacy, stream-like cho block cipher |
| GCM | Nonce (96-bit khuyên dùng) | Có | Có | Không (tag fail → reject all) | Có (AEAD) — GHASH | Tiêu chuẩn #1 (TLS 1.2/1.3, IPsec) |
| CCM | Nonce | Không | Không | Không (tag fail) | Có (AEAD) — CBC-MAC + CTR | IoT, constrained (AES-CCM) |
| OCB | Nonce | Có | Có | Không | Có (AEAD) — 1 pass | An toàn, ít triển khai do patent (hết hạn 2018) |
| XTS | Tweak (sector index) | Có | Có | Không | Không (chỉ confidentiality) | Tiêu chuẩn disk encryption (IEEE 1619, LUKS, BitLocker) |
Chi tiết các chế độ quan trọng
CBC (Cipher Block Chaining)
Enc: C₀ = IV (random); Cᵢ = E(K, Pᵢ ⊕ Cᵢ₋₁)
Dec: Pᵢ = D(K, Cᵢ) ⊕ Cᵢ₋₁
- IV phải ngẫu nhiên, không thể đoán trước (unpredictable) — không dùng counter.
- Padding oracle attack (Vaudenay 2002) nếu dùng padding PKCS#7 và tiết lộ lỗi padding. Khắc phục: AEAD hoặc Encrypt-then-MAC.
CTR (Counter Mode)
Keystream block i = E(K, Nonce || Counter_i)
Cᵢ = Pᵢ ⊕ Keystream_i
- Biến block cipher thành stream cipher.
- Nonce không bao giờ lặp với cùng khóa (key, nonce pair duy nhất).
- Song song hóa hoàn hảo, random access, pre-computation keystream.
GCM (Galois/Counter Mode) — AEAD tiêu chuẩn
- Kết hợp CTR encryption + GHASH authentication (GF(2¹²⁸) polynomial hash).
- Tag 128-bit (hoặc truncate 96/104/112/120/128).
- Nonce 96-bit khuyên dùng (random hoặc counter). Nonce khác 96-bit → GHASH thêm bước hash nonce.
- Rủi ro nghiêm trọng: Lặp (Key, Nonce) → keystream reuse + GHASH key leak → forge tag tùy ý. XChaCha20-Poly1305 an toàn hơn cho nonce random.
- Hỗ trợ phần cứng (AES-NI + PCLMULQDQ).
XTS (XEX Tweakable Block Cipher with Ciphertext Stealing)
- Dành cho disk encryption: sector-based, random access, không mở rộng ciphertext.
- Tweak = sector index → cùng plaintext ở sector khác → ciphertext khác.
- Không cung cấp xác thực (integrity) — cần layer riêng (dm-verity, fsverity).
Khuyến nghị lựa chọn (2024)
- Mạng / TLS / API / Messaging: AES-GCM (có AES-NI) hoặc ChaCha20-Poly1305 / XChaCha20-Poly1305 (AEAD).
- Disk / File encryption (random access): AES-XTS (confidentiality) + integrity layer riêng.
- IoT / Constrained: AES-CCM hoặc ChaCha20-Poly1305.
- Legacy migration: CBC+HMAC-SHA256 (Encrypt-then-MAC) → chuyển AEAD sớm.
- Tuyệt đối không: ECB, CBC không MAC, CTR không MAC, OFB, CFB cho ứng dụng mới.