Định nghĩa Stream Cipher (Mã luồng)
Stream Cipher (Mã luồng) là thuật toán mã hóa đối xứng (symmetric encryption) xử lý dữ liệu theo từng bit hoặc từng byte (8 bit) một cách liên tục, khác với Block Cipher (Mã khối) xử lý theo khối kích thước cố định (64-bit, 128-bit, 256-bit).
Nguyên lý cốt lõi: Tạo ra một keystream (dòng khóa) – chuỗi bit ngẫu nhiên giả (pseudorandom) có độ dài bằng plaintext – sau đó thực hiện phép XOR (phép OR độc quyền) giữa plaintext và keystream để tạo ciphertext:
Ciphertext = Plaintext XOR Keystream
Plaintext = Ciphertext XOR Keystream (giải mã dùng cùng keystream)
Đặc điểm chính
- Tốc độ cao, độ trễ thấp: Phù hợp streaming real-time (voice, video, TLS records, SSH, QUIC).
- Không cần padding: Xử lý dữ liệu độ dài bất kỳ.
- Stateful: Trạng thái nội bộ (internal state) thay đổi sau mỗi bit/byte – phải đồng bộ chính xác giữa sender/receiver.
- Không lan truyền lỗi (Error propagation): Lỗi 1 bit chỉ ảnh hưởng 1 bit ciphertext (khác block cipher: lỗi 1 bit làm hỏng cả block).
- Yêu cầu Keystream không bao giờ tái sử dụng (Key Reuse = Catastrophic): Nếu dùng lại cùng (Key, IV) cho 2 plaintext khác nhau → kẻ tấn công XOR 2 ciphertext → loại bỏ keystream → khôi phục plaintext (Two-time pad attack).
Phân loại Stream Cipher
| Loại | Đặc điểm | Ví dụ |
|---|---|---|
| Synchronous (Đồng bộ) | Keystream tạo ra độc lập với plaintext/ciphertext. Sender & receiver phải đồng bộ trạng thái (counter/nonce). Nếu mất đồng bộ → giải mã sai toàn bộ phần còn lại. Cần cơ chế resynchronization. | ChaCha20, Salsa20, RC4 (deprecated), AES-CTR, AES-GCM (AEAD), ZUC (4G/5G), SNOW 3G/4G/5G |
| Self-Synchronizing (Tự đồng bộ) / Asynchronous | Keystream tạo ra dựa trên N bit ciphertext trước đó. Tự động khôi phục đồng bộ sau N bit nếu mất gói tin. Chậm hơn, ít dùng hơn. | Ciphertext Feedback (CFB) mode của Block Cipher, MUGI (historical) |
Stream Cipher nổi bật & Trạng thái
| Cipher | Trạng thái | Đặc điểm / Ứng dụng |
|---|---|---|
| ChaCha20 / ChaCha20-Poly1305 (AEAD) | TIÊU CHUẨN HIỆN TẠI (IETF RFC 8439) | Thiết kế bởi Daniel J. Bernstein. Nhanh, an toàn, side-channel resistant (ARX: Add-Rotate-XOR). Dùng trong TLS 1.3, SSH, WireGuard, QUIC, IPsec, Age, NaCl/libsodium. Khuyên dùng thay RC4/AES-CTR khi không có AES-NI. |
| AES-CTR (Counter Mode) | Tiêu chuẩn (NIST SP 800-38A) | Biến AES block cipher thành stream cipher. Cần AES-NI (hardware acceleration) để nhanh. Dùng trong TLS 1.2, IPsec, SRTP, Kerberos. Không có authentication – phải kết hợp HMAC hoặc dùng AES-GCM/CCM (AEAD). |
| AES-GCM / AES-CCM (AEAD) | Tiêu chuẩn (NIST SP 800-38D/38C) | Authenticated Encryption with Associated Data. Cùng lúc mã hóa & xác thực (integrity). Dùng trong TLS 1.2/1.3, IPsec, SSH, Wi-Fi (WPA2/3 CCMP/GCMP), Kubernetes secrets. Tiêu chuẩn vàng hiện nay. |
| RC4 (Rivest Cipher 4) | DEPRECATED / CẤM DÙNG (RFC 7465) | Thiết kế 1987, dùng rộng rãi trong SSL/TLS, WEP, WPA-TKIP. Lỗ hổng bias trong keystream byte đầu (Fluhrer-Mantin-Shamir, Royal Holloway) → khôi phục plaintext. Loại bỏ hoàn toàn. |
| Salsa20 / XSalsa20 | Tiền thân ChaCha20 | Cùng tác giả DJB. XSalsa20 mở rộng nonce 192-bit. Ít dùng hơn ChaCha20. |
| ZUC / SNOW 3G/4G/5G | Tiêu chuẩn 3GPP | Dùng trong mã hóa 4G LTE (EEA2/EIA2), 5G (128-EEA3/128-EIA3). Phần cứng chuyên dụng. |
| Grain / Trivium / Mickey | Lightweight (ISO/IEC 29192) | Dành cho RFID, sensor, IoT cực hạn tài nguyên (hardware gate count thấp). |
Stream Cipher vs Block Cipher – So sánh
| Tiêu chí | Stream Cipher | Block Cipher (ECB/CBC/CTR/GCM) |
|---|---|---|
| Đơn vị xử lý | Bit / Byte (stream) | Khối cố định (64/128/256 bit) |
| Padding | Không cần | Cần (trừ CTR/GCM/CFB/OFB) |
| Tốc độ phần mềm (không AES-NI) | Nhanh hơn (ChaCha20 ~3-4x AES) | Chậm (AES software implementation) |
| Tốc độ phần cứng (có AES-NI) | Nhanh | Rất nhanh (AES-NI 1-3 cycles/byte) |
| Lan truyền lỗi | 1 bit lỗi → 1 bit sai | CBC: 1 block lỗi → 2 block sai; CTR/GCM: 1 bit |
| Parallelization | Khó (sequential state) | CTR/GCM: Song song hoàn hảo |
| Nonce/IV reuse risk | Cực kỳ nguy hiểm (Key reuse = break) | Cũng nguy hiểm (CTR/GCM), ECB: pattern leak |
| Authentication | Cần AEAD (Poly1305, GMAC) hoặc HMAC riêng | GCM/CCM/OCB: Built-in AEAD |
Ứng dụng thực tế trong Bảo mật mạng
- TLS 1.3: Bắt buộc AEAD – ChaCha20-Poly1305 hoặc AES-GCM (cả hai là stream-based AEAD).
- WireGuard VPN: ChaCha20-Poly1305 – hiệu năng cao, code đơn giản (4000 dòng).
- QUIC / HTTP/3: TLS 1.3 기반 – ChaCha20-Poly1305 / AES-GCM.
- SSH:
chacha20-poly1305@openssh.com,aes256-gcm@openssh.com. - IPsec ESP: AES-GCM, ChaCha20-Poly1305 (RFC 7634).
- Wi-Fi (WPA2/WPA3): CCMP (AES-CCM) / GCMP (AES-GCMP) – block cipher mode nhưng hoạt động như stream trên từng frame.
- Disk Encryption: XTS mode (block) – không dùng stream cipher do cần random access.
- Age (file encryption): ChaCha20-Poly1305.
Yêu cầu an toàn thiết kế Stream Cipher
- CSPRNG (Cryptographically Secure PRNG): Keystream phải không thể dự đoán được bit tiếp theo kể cả biết nhiều bit trước (next-bit test).
- Nonce/IV duy nhất (Unique Nonce): Mỗi (Key, Nonce) chỉ dùng 1 lần. Nonce có thể public nhưng không được lặp lại. Counter/IV quản lý cẩn thận.
- Key Space lớn: ≥ 128-bit (256-bit cho ChaCha20, AES-256).
- Kháng tấn công Time-Memory-Data Tradeoff.
- Side-channel resistance: Constant-time implementation (ChaCha20 ARX tự nhiên constant-time).
- Authenticated Encryption (AEAD): Luôn kết hợp authentication (Poly1305, GMAC) – không bao giờ dùng unauthenticated stream cipher riêng lẻ.
Kết luận
Stream Cipher là xương sống của mã hóa truyền thông hiện đại (TLS 1.3, WireGuard, QUIC, SSH). ChaCha20-Poly1305 và AES-GCM là hai tiêu chuẩn AEAD (Authenticated Encryption with Associated Data) thống trị – cung cấp cả Confidentiality và Integrity/Authentication trong một primitive duy nhất. RC4 đã chết. Khi triển khai: ưu tiên thư viện đã kiểm chứng (libsodium, OpenSSL, BoringSSL, Go crypto, Rust ring) – đừng tự viết crypto.