Mã hóa ChaCha20
Mã hóa dòng hiện đại với xác thực tùy chọn
Bảo mật phía máy khách
ChaCha20-Poly1305 (RFC 8439) là chế độ AEAD được khuyến nghị. ChaCha20 thuần không cung cấp tính toàn vẹn — luôn sử dụng với Poly1305. Nonce 96 bit: bắt buộc đảm bảo tính duy nhất. XChaCha20-Poly1305 (192 bit) cho tạo nonce ngẫu nhiên an toàn.
Giá trị bộ đếm ban đầu (mặc định: 0)
Về ChaCha20
ChaCha20 là mật mã dòng ARX của Bernstein (2008), biến thể cải tiến của Salsa20. Cùng ma trận 4×4 nhưng quarter-round được thiết kế lại với xoay 16-12-8-7: khuếch tán hoàn toàn trong 2 vòng (Salsa20: 4 vòng). IETF (RFC 8439): nonce 96 bit + bộ đếm 32 bit (tối đa 256 GB/nonce).
ChaCha20-Poly1305 (RFC 7539→RFC 8439): AEAD chuẩn hóa IETF. Khóa Poly1305 một lần từ 32 byte đầu ChaCha20 (bộ đếm=0), mã hóa từ bộ đếm=1. Tag 128 bit. Google 2014 triển khai cho Android TLS. TLS 1.3 (RFC 8446): TLS_CHACHA20_POLY1305_SHA256 bắt buộc.
So sánh thuật toán
| Thuật toán | Xác thực | Độ dài khóa | Kích thước Nonce | Trường hợp sử dụng |
|---|---|---|---|---|
| ChaCha20 | Mã hóa dòng | 256 bits | 96 bits (12 bytes) | Nghiên cứu giao thức; luồng với xác thực ở lớp trên; benchmarking |
| ChaCha20-Poly1305 | AEAD | 256 bits | 96 bits (12 bytes) | TLS 1.3, WireGuard, SSH, QUIC, Signal; thiết bị không có AES-NI; AEAD kháng tấn công timing |
| XChaCha20 | Mã hóa dòng | 256 bits | 192 bits (24 bytes) | Mã hóa tệp/DB không đảm bảo nonce duy nhất qua bộ đếm; libsodium secretstream; mã hóa sao lưu nonce độc lập |
| XChaCha20-Poly1305 | AEAD | 256 bits | 192 bits (24 bytes) | Dữ liệu lưu trữ cần nonce ngẫu nhiên + xác thực 128 bit; lưu trữ libsodium; AEAD mặc định khi không thể quản lý nonce tập trung |
Cách ChaCha20 hoạt động
Khởi tạo 4×4: hàng 0=hằng số “expa nd 32-byte k”, hàng 1-2=khóa 256 bit (8×32), hàng 3=[bộ đếm|nonce₀|nonce₁|nonce₂] (IETF). Quarter-round(a,b,c,d): a+=b; d^=a; d⋘16; c+=d; b^=c; b⋘12; a+=b; d^=a; d⋘8; c+=d; b^=c; b⋘7.
Vòng đôi = quarter-round cột + đường chéo. Xoay 16-12-8-7: khuếch tán hoàn toàn trong 2 vòng (Salsa20: 4). 10 vòng đôi; đầu ra = XOR trạng thái đã biến đổi với trạng thái ban đầu.
AEAD: Mã hóa xác thực
ChaCha20-Poly1305 AEAD (RFC 8439): khóa Poly1305 một lần từ 32 byte đầu ChaCha20 (bộ đếm=0); mã hóa từ bộ đếm=1; MAC: [AAD đệm||bản mã đệm||len(AAD)||len(bản mã)]; tag 16 byte.
XChaCha20-Poly1305: HChaCha20 dẫn xuất khóa con 256 bit từ 128 bit đầu nonce 192 bit + khóa gốc. 2^32 tin nhắn → xác suất va chạm 2^(-128). libsodium: crypto_aead_xchacha20poly1305_ietf_encrypt.
Tính năng chính
- Khuếch tán tốt hơn Salsa20: xoay 16-12-8-7 → khuếch tán hoàn toàn trong 2 vòng (Salsa20: 4). ChaCha20/8 ≈ Salsa20/16 về bảo mật.
- Chuẩn hóa IETF (RFC 8439, 2018): TLS 1.3, WireGuard, SSH, QUIC, Signal, Noise Protocol, Android TLS.
- Hiệu suất không phụ thuộc AES-NI: nhanh hơn AES-GCM 25-40% trên ARM, RISC-V, MIPS. Lý tưởng cho IoT/di động/nhúng.
- Nonce 96 bit IETF: bộ đếm 32 bit (tối đa 256 GB/nonce). XChaCha20: 192 bit cho tạo nonce ngẫu nhiên an toàn.
- Không có tấn công đã biết vào ChaCha20/20 (2025). Phân tích vòng giảm tốt nhất: Shi et al. (2012) trên ChaCha20/6.
Lưu ý bảo mật
- Tái sử dụng nonce phá hủy ChaCha20-Poly1305: XOR bản rõ lộ + khóa Poly1305 bị tiết lộ. TLS 1.3: nonce = số thứ tự XOR.
- Giới hạn bộ đếm 32 bit: tối đa 256 GB/(khóa, nonce). TLS 1.3 tự động rekey qua key_update.
- Khóa Poly1305 một lần: tái sử dụng nonce → tái sử dụng khóa Poly1305 → tấn công giả mạo (Bernstein 2005). RFC 8439 §2.8.
- Cắt ngắn tag bị cấm: RFC 8439 yêu cầu 16 byte. Cắt xuống 64 bit → 2^(-64), không tuân thủ TLS 1.3.
Sử dụng thực tế
- TLS 1.3 (RFC 8446): TLS_CHACHA20_POLY1305_SHA256 bắt buộc. OpenSSL, BoringSSL, NSS, WolfSSL, mbedTLS.
- WireGuard VPN: mật mã đối xứng duy nhất (Donenfeld 2017, Linux 5.6). Kết hợp Curve25519, Poly1305, BLAKE2, SipHash.
- Signal Protocol/Double Ratchet: ChaCha20-Poly1305 sau X3DH. WhatsApp, Facebook Messenger bí mật, Matrix, Keybase.
- OpenSSH chacha20-poly1305@openssh.com (6.5, 2014): hai phiên bản ChaCha20 để loại bỏ rò rỉ timing.
- Google Mobile TLS (2014): Langley+Duong. Nhanh gấp 3 lần AES-128-GCM trên Nexus 5 Cortex-A15. Ảnh hưởng IETF.