Chiffrer ne suffit pas
Confidentialité contre intégrité : pourquoi un adversaire qui ne peut pas lire peut quand même tout casser, et comment le chiffrement authentifié répond.
En 2011, des chercheurs ont montré qu’un adversaire positionné entre un navigateur et un serveur HTTPS pouvait, sans jamais déchiffrer un seul octet, modifier les données chiffrées de façon prévisible et forcer des comportements non prévus par l’application. L’attaque ne lisait rien. Elle réécrivait.
Ce scénario, qui s’appelle la malléabilité Malléabilité Propriété d'un schéma de chiffrement où une modification du chiffré produit un changement prédicible et exploitable du clair correspondant. Les modes de chiffrement sans authentification (flux, CTR, CBC sans MAC) sont malléables. L'utilisation d'un algorithme AEAD supprime cette propriété en faisant échouer tout déchiffrement d'un chiffré altéré. , est le problème central de ce chapitre. Le chiffrement classique cache le contenu. Il ne garantit pas que le contenu n’a pas été altéré en chemin.
À la fin de ce chapitre, tu sauras expliquer la différence entre confidentialité et intégrité, reconnaître la malléabilité d’un chiffrement non authentifié, et dire ce que l’ AEAD Chiffrement authentifié (AEAD) Primitive cryptographique qui garantit simultanément la confidentialité et l'intégrité d'un message. Elle produit un tag d'authentification joint au chiffré, et toute altération des données rend le déchiffrement impossible. AEAD (Authenticated Encryption with Associated Data) étend ce mécanisme en protégeant également des données associées non chiffrées, liées au contexte d'utilisation. Source : NIST SP 800-38D garantit et comment.
Confidentialité contre intégrité
Ces deux propriétés sont distinctes, et les confondre est la source de nombreuses vulnérabilités réelles.
La confidentialité garantit qu’un adversaire qui observe le message chiffré ne peut pas en déduire le contenu. Elle protège contre un attaquant passif, qui écoute.
L’intégrité garantit qu’un adversaire ne peut pas modifier le message sans que cette modification soit détectée. Elle protège contre un attaquant actif, qui intervient.
Un système peut avoir l’une sans l’autre. Et c’est là que réside le piège.
L’adversaire actif
Prenons un exemple concret. Un service de paiement chiffre le montant d’un virement avec un mode CTR (compteur). En mode CTR, le chiffrement XOR le texte clair avec un flux pseudo-aléatoire généré depuis la clé et un compteur. Un bit à zéro dans le texte clair devient un bit selon le flux, et vice versa.
Si un adversaire connaît la position dans le texte chiffré qui correspond au champ “montant”, il peut inverser exactement le bon bit dans le chiffré. Quand le destinataire déchiffre, il obtient un montant modifié. L’adversaire n’a jamais su quel était le montant original. Il l’a juste changé.
C’est la malléabilité Malléabilité Propriété d'un schéma de chiffrement où une modification du chiffré produit un changement prédicible et exploitable du clair correspondant. Les modes de chiffrement sans authentification (flux, CTR, CBC sans MAC) sont malléables. L'utilisation d'un algorithme AEAD supprime cette propriété en faisant échouer tout déchiffrement d'un chiffré altéré. : la propriété d’un schéma de chiffrement qui permet de transformer un chiffré en un autre chiffré dont le déchiffrement est prévisible, sans connaître la clé.
Un schéma confidentiel peut être malléable. Un schéma malléable n’offre aucune garantie d’intégrité.
L’AEAD, la réponse
Le chiffrement authentifié avec données associées, noté AEAD Chiffrement authentifié (AEAD) Primitive cryptographique qui garantit simultanément la confidentialité et l'intégrité d'un message. Elle produit un tag d'authentification joint au chiffré, et toute altération des données rend le déchiffrement impossible. AEAD (Authenticated Encryption with Associated Data) étend ce mécanisme en protégeant également des données associées non chiffrées, liées au contexte d'utilisation. Source : NIST SP 800-38D (Authenticated Encryption with Associated Data), résout ce problème en combinant confidentialité et intégrité dans une seule opération.
Un schéma AEAD expose deux opérations :
- Seal (fermer) : prend une clé , un nonce Nonce Valeur utilisée une seule fois avec une clé donnée. C'est l'unicité qui importe, non le secret : réutiliser un nonce avec la même clé brise complètement le schéma. Un nonce aléatoire de 192 bits (XChaCha20) offre une probabilité de collision négligeable, tandis qu'un compteur de 96 bits (AES-GCM, ChaCha20-Poly1305) exige une gestion rigoureuse pour ne jamais dépasser 2^32 messages par clé. Source : RFC 8439 , des données associées et un texte clair . Produit un texte chiffré augmenté d’un tag d’authentification : .
- Open (ouvrir) : prend , , et . Vérifie le tag Tag d'authentification Valeur courte (typiquement 128 bits) produite par un algorithme AEAD ou un MAC, et vérifiée lors du déchiffrement. Toute modification du chiffré, des données associées ou du nonce invalide le tag et fait échouer l'ouverture. Il garantit à la fois l'intégrité et l'authenticité du message. , puis déchiffre. Si la vérification échoue, retourne une erreur, sans rien révéler d’autre.
Chaque symbole a son rôle :
- : la clé secrète partagée entre les deux parties.
- : le nonce, un nombre utilisé une seule fois. Il garantit que deux chiffrements du même texte clair avec la même clé produisent des chiffrés différents. Les détails sont en module 3.
- : les données associées, des métadonnées authentifiées mais non chiffrées (un en-tête HTTP, un identifiant de session, une version de protocole). Elles ne font pas partie du chiffré, mais toute modification les concernant invalide le tag. Le module 2 y revient en détail.
- : le texte clair (plaintext), le message à protéger.
- : la sortie, c’est-à-dire le texte chiffré concaténé avec le tag d’authentification.
Le tag d’authentification
Le tag Tag d'authentification Valeur courte (typiquement 128 bits) produite par un algorithme AEAD ou un MAC, et vérifiée lors du déchiffrement. Toute modification du chiffré, des données associées ou du nonce invalide le tag et fait échouer l'ouverture. Il garantit à la fois l'intégrité et l'authenticité du message. est une empreinte cryptographique calculée sur le chiffré et les données associées avec la clé. Il est produit lors du seal et vérifié lors du open.
Si un bit du chiffré a été inversé, si une donnée associée a changé, si le tag lui-même a été trafiqué : la vérification échoue. L’open retourne une erreur générique, sans indiquer ce qui a changé ni où. Cette absence d’information est intentionnelle : révéler la cause permettrait à un adversaire d’apprendre quelque chose, attaque par oracle.
Le chiffrement cache, il ne protège pas. L’intégrité se prouve, elle ne se suppose pas.
Comment se passe un seal et un open
Essaie par toi-même
Le composant ci-dessous te permet d’inverser un bit dans le chiffré et d’observer ce qui se passe selon le mode.
En mode chiffrement simple, le bit inversé traverse le déchiffrement sans que personne ne le détecte. Le texte clair qui ressort est altéré, silencieusement.
En mode AEAD, le même bit inversé provoque un échec de vérification du tag. L’open retourne un rejet. Aucune information sur le contenu n’est divulguée.
Remarque la différence de comportement. Dans un système réel, le mode simple laisserait passer le message altéré sans aucun avertissement. Le mode AEAD refuse catégoriquement.
Quiz
1. Un message est chiffré avec un mode CTR non authentifié. Un adversaire intercepte le chiffré et inverse un bit. Que se passe-t-il quand le destinataire déchiffre ?
2. Quelle propriété l'AEAD ajoute-t-elle au chiffrement classique ?
3. Quand l'open d'un schéma AEAD échoue, que doit-il retourner ?
4. Un service chiffre un cookie de session avec AES-GCM. L'utilisateur modifie le cookie dans son navigateur et renvoie la requête. Que se passe-t-il côté serveur ?
Ce qu’il faut retenir
- La confidentialité (le chiffrement) cache le contenu à un adversaire passif. Elle ne protège pas contre un adversaire actif qui modifie les données.
- L’intégrité garantit qu’une modification est détectée. Elle se prouve par un tag cryptographique, elle ne se suppose pas.
- La malléabilité Malléabilité Propriété d'un schéma de chiffrement où une modification du chiffré produit un changement prédicible et exploitable du clair correspondant. Les modes de chiffrement sans authentification (flux, CTR, CBC sans MAC) sont malléables. L'utilisation d'un algorithme AEAD supprime cette propriété en faisant échouer tout déchiffrement d'un chiffré altéré. est la propriété d’un chiffrement qui permet de transformer un chiffré en un chiffré prévisible sans connaître la clé. Les modes CTR et CBC non authentifiés en souffrent.
- L’ AEAD Chiffrement authentifié (AEAD) Primitive cryptographique qui garantit simultanément la confidentialité et l'intégrité d'un message. Elle produit un tag d'authentification joint au chiffré, et toute altération des données rend le déchiffrement impossible. AEAD (Authenticated Encryption with Associated Data) étend ce mécanisme en protégeant également des données associées non chiffrées, liées au contexte d'utilisation. Source : NIST SP 800-38D (chiffrement authentifié avec données associées) combine les deux propriétés en une seule opération : seal produit chiffré + tag, open vérifie le tag avant de déchiffrer.
- Un open qui échoue retourne une erreur générique, sans information sur la cause. Cette opacité est une propriété de sécurité, pas un manque de détail.
- Les données associées sont authentifiées mais non chiffrées : les modifier invalide le tag, même si le chiffré est intact.
- Les algorithmes AEAD courants sont AES-GCM et ChaCha20-Poly1305. Les modules suivants examinent leurs propriétés, leurs contraintes et leurs cas d’usage.