Chiffrement ChaCha20
Chiffrement par flux moderne avec authentification optionnelle
Sécurité côté client
ChaCha20-Poly1305 (RFC 8439) est le mode AEAD recommandé. ChaCha20 seul n'offre pas d'intégrité — toujours utiliser avec Poly1305. Nonce 96 bits: unicité stricte obligatoire. XChaCha20-Poly1305 (192 bits) pour génération aléatoire sécurisée.
Valeur initiale du compteur (défaut : 0)
À propos de ChaCha20
ChaCha20 est un chiffre de flux ARX de Bernstein (2008), variante améliorée de Salsa20. Même matrice 4×4 mais quarter-round redessiné avec rotations 16-12-8-7 (vs 7-9-13-18 pour Salsa20): diffusion complète en 2 tours au lieu de 4. IETF (RFC 8439): nonce 96 bits + compteur 32 bits (max 256 Go/nonce).
ChaCha20-Poly1305 (RFC 7539→RFC 8439): AEAD standardisé IETF. Clé Poly1305 dérivée des 32 premiers octets de ChaCha20 (compteur=0), puis chiffrement à compteur=1. Tag 128 bits. Déployé par Google en 2014 pour Android TLS. TLS 1.3 (RFC 8446): TLS_CHACHA20_POLY1305_SHA256 obligatoire.
Comparaison des algorithmes
| Algorithme | Authentification | Longueur de clé | Taille du nonce | Cas d'utilisation |
|---|---|---|---|---|
| ChaCha20 | Chiffrement par flux | 256 bits | 96 bits (12 bytes) | Recherche protocole; streaming avec authentification niveau supérieur; benchmarking |
| ChaCha20-Poly1305 | AEAD | 256 bits | 96 bits (12 bytes) | TLS 1.3, WireGuard, SSH, QUIC, Signal; appareils sans AES-NI; services internet AEAD résistant timing |
| XChaCha20 | Chiffrement par flux | 256 bits | 192 bits (24 bytes) | Chiffrement fichiers/DB où unicité nonce par compteur impossible; libsodium secretstream; chiffrement sauvegardes nonces indépendants |
| XChaCha20-Poly1305 | AEAD | 256 bits | 192 bits (24 bytes) | Données au repos nécessitant nonce aléatoire + 128 bits auth; stockage libsodium; AEAD par défaut quand nonce non centralisable |
Fonctionnement de ChaCha20
Initialisation 4×4: ligne 0=constantes “expa nd 32-byte k”, lignes 1-2=clé 256 bits (8×32), ligne 3=[compteur|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.
Double tour = quarter-round colonnes + diagonales. Rotations 16-12-8-7: diffusion complète en 2 tours (Salsa20: 4 tours). 10 doubles tours; sortie = XOR état transformé avec état initial.
AEAD : Chiffrement authentifié
ChaCha20-Poly1305 (RFC 8439): clé Poly1305 one-time dérivée des 32 premiers octets ChaCha20 (compteur=0); chiffrement à partir du compteur=1; MAC sur [AAD paddé||chiffré paddé||len(AAD)||len(chiffré)]; tag 16 octets.
XChaCha20-Poly1305: HChaCha20 dérive une sous-clé 256 bits des 128 premiers bits d'un nonce 192 bits + clé originale. 2^32 messages → probabilité collision 2^(-128). libsodium: crypto_aead_xchacha20poly1305_ietf_encrypt.
Caractéristiques principales
- Meilleure diffusion que Salsa20: rotations 16-12-8-7 → diffusion complète en 2 tours (Salsa20: 4 tours). ChaCha20/8 ≈ Salsa20/16 en sécurité.
- Standardisation IETF (RFC 8439, 2018): TLS 1.3, WireGuard, SSH, QUIC, Signal, Noise Protocol, Android TLS.
- Performance sans AES-NI: 25-40% plus rapide qu'AES-GCM sur ARM Cortex-A53/A55, RISC-V, MIPS. Idéal IoT/mobile/embarqué.
- Nonce 96 bits IETF: compteur 32 bits (max 256 Go/nonce). XChaCha20: 192 bits pour génération aléatoire sécurisée.
- Aucune attaque connue sur ChaCha20/20 (2025). Meilleure analyse réduite: Shi et al. (2012) sur ChaCha20/6.
Considérations de sécurité
- Réutilisation de nonce catastrophique en ChaCha20-Poly1305: XOR plaintexts exposé + clé Poly1305 révélée. TLS 1.3: nonce XOR numéro de séquence.
- Limite compteur 32 bits: max 256 Go par (clé, nonce). TLS 1.3 re-keying via key_update avant dépassement.
- Clé Poly1305 one-time: réutilisation nonce → réutilisation clé Poly1305 → attaque forgery (Bernstein 2005). RFC 8439 §2.8 prévient cela.
- Tag tronqué interdit: RFC 8439 exige 16 octets. Troncature à 64 bits → résistance à 2^(-64), non conforme TLS 1.3.
Utilisation réelle
- TLS 1.3 (RFC 8446): TLS_CHACHA20_POLY1305_SHA256 obligatoire. OpenSSL, BoringSSL, NSS, WolfSSL, mbedTLS.
- WireGuard VPN: seul chiffre symétrique (Donenfeld 2017, Linux 5.6). Avec Curve25519, Poly1305, BLAKE2, SipHash.
- Signal Protocol/Double Ratchet: ChaCha20-Poly1305 après X3DH. WhatsApp, Messenger secret, Matrix, Keybase.
- OpenSSH chacha20-poly1305@openssh.com (6.5, 2014): deux instances ChaCha20 pour éliminer les fuites de timing.
- Google Mobile TLS (2014): Langley+Duong. 3x plus rapide qu'AES-128-GCM sur Nexus 5 Cortex-A15. Influence IETF.
Références
Outils Connexes
Cryptage/Décryptage AES
Crypter et décrypter du texte en toute sécurité à l'aide de l'algorithme AES
Famille RC (RC4/RC5/RC6)
Chiffrements en flux et par blocs de la famille RC incluant RC4, RC4-Drop, RC5 et RC6 (finaliste AES)
Chiffrement/Déchiffrement Blowfish
Chiffrement par blocs symétrique rapide conçu par Bruce Schneier, avec longueur de clé variable (32-448 bits)