Stream Cipher mã hóa bit/byte từng cái một bằng cách sinh keystream (dãy pseudorandom) từ khóa K và nonce N, sau đó XOR với plaintext: C = P ⊕ Keystream(K, N). Giải mã: P = C ⊕ Keystream(K, N) (tự nghịch đảo).
Cấu trúc cốt lõi
- Key (K): 128/256-bit bí mật.
- Nonce / IV (N): 64-128-bit, duy nhất cho mỗi khóa (critical!).
- Keystream Generator: PRG (Pseudorandom Generator) biến (K, N) → keystream dài tùy ý.
- Internal State: Trạng thái nội bộ lớn (256-512-bit) đảm bảo chu kỳ lớn, chống state recovery.
Stream Cipher hiện đại tiêu chuẩn
| Cipher | Thiết kế | Khóa/Nonce | Đặc điểm | Trạng thái |
|---|---|---|---|---|
| ChaCha20 | ARX (Add-Rotate-XOR), 20 vòng, 512-bit state | 256-bit key, 96-bit nonce (32-bit counter) | Nhanh phần mềm, constant-time tự nhiên, không S-box/table | Tiêu chuẩn #1 (TLS 1.3, WireGuard, Signal, age) |
| XChaCha20 | ChaCha20 + HChaCha20 mở rộng nonce | 256-bit key, 192-bit nonce | Nonce random an toàn (không lo lặp), khuyên dùng cho ứng dụng mới | Khuyên dùng #1 cho nonce random |
| AES-CTR | AES block cipher chế độ CTR | 128/256-bit key, 96-bit nonce + 32-bit counter | Nhanh nếu AES-NI, nhưng cần phần cứng; side-channel risk nếu soft-AES | Dùng khi có AES-NI |
| AES-GCM / ChaCha20-Poly1305 | AEAD (Stream cipher + MAC) | Cùng trên + Poly1305 / GHASH | Mã hóa + xác thực cùng lúc — bắt buộc dùng AEAD | Tiêu chuẩn thực tế |
| Salsa20 | ARX, 20 vòng, tiền thân ChaCha20 | 256-bit key, 64-bit nonce | Nonce nhỏ (64-bit) → rủi ro lặp nếu random | Legacy, thay bằng ChaCha20/XChaCha20 |
Ưu điểm Stream Cipher (vs Block Cipher)
- Không cần padding: Mã hóa độ dài tùy ý tự nhiên.
- Tốc độ cao, latency thấp: XOR bit/byte, phù hợp streaming (voice, video, TLS record).
- Song song hóa dễ dàng: Keystream block độc lập (CTR, ChaCha20 block).
- Code nhỏ: ChaCha20 ~200 dòng C, không table lookup.
- Không error propagation: Lỗi 1 bit ciphertext → chỉ lỗi 1 bit plaintext.
Nhược điểm & Rủi ro
- Nonce reuse = thảm họa: Cùng (K, N) cho 2 plaintext → keystream reuse → P₁ ⊕ P₂ = C₁ ⊕ C₂ (two-time pad). XChaCha20 (192-bit nonce) khắc phục bằng random nonce an toàn.
- Không xác thực (malleability): Kẻ sửa ciphertext → plaintext sửa tương ứng không bị phát hiện. Bắt buộc dùng AEAD (Poly1305, GCM) hoặc thêm MAC riêng (Encrypt-then-MAC).
- Không có diffusion tự nhiên: Mỗi bit plaintext chỉ ảnh hưởng 1 bit ciphertext.
Best Practices (2024)
- Luôn dùng AEAD: ChaCha20-Poly1305 (RFC 8439) hoặc AES-GCM.
- Ưu tiên XChaCha20-Poly1305 (libsodium, Tink, age, rage) — nonce 192-bit random an toàn.
- Nếu phải dùng raw stream cipher: Nonce counter-based (không random), lưu trữ state cẩn thận.
- Key derivation: HKDF từ master key → per-message key (nonce = 0).
- Triển khai constant-time, zeroize key/state sau dùng.