ChaCha20
ChaCha20 : Algorithme de chiffrement à flot
ChaCha20 est un algorithme de chiffrement symétrique à flot utilisé par les protocoles tels que TLS ou SSH. Il est rapide, sécurisé et facile à implémenter.
Fonctionnement général d’un chiffrement à flot
Les algorithmes de chiffrement à flot chiffrent un message bit à bit (ou octet par octet) en générant un flux pseudo-aléatoire de bits appelé keystream, qui est ensuite combiné au message avec l’opération XOR pour le chiffrer.
Ce keystream est généré dynamiquement à partir de trois éléments :
- Une clé secrète (key)
- Un vecteur d’initialisation (IV ou nonce)
- Un compteur de blocs (counter)
Dans le cas de ChaCha20 :
- La clé est de 256 bits (32 octets)
- Le vecteur d’initialisation est de 96 bits (12 octets)
- Le compteur est un entier sur 32 bits
Le keystream est ensuite produit par une fonction de permutation pseudo-aléatoire non linéaire : la fonction ChaCha.
Chiffrement et déchiffrement avec XOR
Le chiffrement se fait en XORant le message avec le keystream :
1
ciphertext = plaintext ⊕ keystream
Grâce à la propriété d’auto-inversion du XOR, le déchiffrement se fait comme suit :
1
plaintext = ciphertext ⊕ keystream
Cette propriété nous permet donc de retrouver le keystream à partir du message en clair et de son équivalent chiffré.
1
keystream = plaintext ⊕ ciphertext
Sécurité du keystream et des secrets
A partir du keystream, on ne peut pas retrouver la clé secrète, ni le vecteur d’initialisation, même en disposant de l’un des deux. En effet, les opérations effectuées pour calculer le keystream sont des permutations non linéaires, conçues pour ne pas être inversées.
Toutefois ChaCha20, tout comme les autres algorithmes de chiffrement par flot comme RC4 ou AES en mode CTR, est vulnérable à des attaques two-time pad. Ce type d’attaque survient lorsque deux messages sont chiffrés avec le même keystream (c’est-à-dire avec la même clé et le même vecteur d’initialisation). Dans ce cas, il devient possible pour un attaquant, connaissant un message en clair et son équivalent chiffré, de reconstituer le keystream généré et l’utiliser pour déchiffrer un second message chiffré avec ce même keystream. Pour que le message soit déchiffré entièrement, il faut s’assurer qu’il soit plus court que le keystream calculé. Cela compromet totalement la sécurité du second message. Pour éviter ce type d’attaque, il est donc impératif de ne jamais réutiliser le couple (clé, IV) pour chiffrer deux messages différents.
En pratique
Pour illustrer ce principe, un outil a été créé, permettant de retrouver un message en clair à partir de son chiffrement associé et d’un premier message en clair et son équivalent chiffré : https://github.com/0cmenog/ChaCha20Decoder.