Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình

Stream Cipher (Mật mã luồng) trong An ninh Thông tin

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

CipherThiết kếKhóa/NonceĐặc điểmTrạng thái
ChaCha20ARX (Add-Rotate-XOR), 20 vòng, 512-bit state256-bit key, 96-bit nonce (32-bit counter)Nhanh phần mềm, constant-time tự nhiên, không S-box/tableTiêu chuẩn #1 (TLS 1.3, WireGuard, Signal, age)
XChaCha20ChaCha20 + HChaCha20 mở rộng nonce256-bit key, 192-bit nonceNonce random an toàn (không lo lặp), khuyên dùng cho ứng dụng mớiKhuyên dùng #1 cho nonce random
AES-CTRAES block cipher chế độ CTR128/256-bit key, 96-bit nonce + 32-bit counterNhanh nếu AES-NI, nhưng cần phần cứng; side-channel risk nếu soft-AESDùng khi có AES-NI
AES-GCM / ChaCha20-Poly1305AEAD (Stream cipher + MAC)Cùng trên + Poly1305 / GHASHMã hóa + xác thực cùng lúc — bắt buộc dùng AEADTiêu chuẩn thực tế
Salsa20ARX, 20 vòng, tiền thân ChaCha20256-bit key, 64-bit nonceNonce nhỏ (64-bit) → rủi ro lặp nếu randomLegacy, 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)

  1. Luôn dùng AEAD: ChaCha20-Poly1305 (RFC 8439) hoặc AES-GCM.
  2. Ưu tiên XChaCha20-Poly1305 (libsodium, Tink, age, rage) — nonce 192-bit random an toàn.
  3. Nếu phải dùng raw stream cipher: Nonce counter-based (không random), lưu trữ state cẩn thận.
  4. Key derivation: HKDF từ master key → per-message key (nonce = 0).
  5. Triển khai constant-time, zeroize key/state sau dùng.