Mode d'opération (cryptographie)
En cryptographie, un mode d'opération est la manière de traiter les blocs de texte clairs et chiffrés au sein d'un algorithme de chiffrement par bloc. Historiquement, les modes d'opération ont été abondamment étudiés pour leur propriétés de propagation d'erreurs lors de divers scénarios de modification de données durant le chiffrement. Les développements suivants ont considéré que la protection de l'intégrité était un objectif à atteindre par des moyens complètement différents. Mais aujourd'hui il existe des modes d'opérations qui associent chiffrement et authentification de manière efficace.
Plusieurs modes existent, certains sont plus vulnérables que d'autres :
- Dictionnaire de codes (Electronic Code Book, ECB)
- Enchaînement des blocs (Cipher Block Chaining, CBC)
- Chiffrement à rétroaction (Cipher Feedback, CFB)
- Chiffrement à rétroaction de sortie (Output Feedback, OFB)
- Chiffrement basé sur un compteur (CounTeR, CTR)
- Chiffrement avec vol de texte (CipherText Stealing, CTS)
- Compteur avec CBC-MAC, voir l'article CCMP
- EAX (inventé par David Wagner et al.)
- CWC (à deux passes)
Dictionnaire de codes : « Electronic codebook » (ECB)
Il s'agit du mode le plus simple. Le message à chiffrer est subdivisé en plusieurs blocs qui sont chiffrés séparément les uns après les autres. Le gros défaut de cette méthode est que deux blocs avec le même contenu seront chiffrés de la même manière, on peut donc tirer des informations à partir du texte chiffré en cherchant les séquences identiques. On obtient dès lors un « dictionnaire de codes » avec les correspondances entre le clair et le chiffré d'où le terme codebook.
Ce mode est pour ces raisons fortement déconseillé dans toute application cryptographique. Le seul avantage qu'il peut procurer est un accès rapide à une zone quelconque du texte chiffré et la possibilité de déchiffrer une partie seulement des données. Mais un mode bien plus sûr basé sur un compteur permet également ces accès aléatoires et les déchiffrements partiels.
Exemple sur du texte
On chiffre les deux messages suivants avec un mode ECB et un algorithme de chiffrement par bloc qui travaille avec un bloc de deux caractères à la fois. Ce type de fichier pourrait correspondre à une liste de salaires.
JOHN__105000 JACK__500000
Le chiffrement sur le premier message donne ceci :
JO|HN|__|10|50|00 Q9|2D|FP|VX|C9|IO
Et sur le deuxième message, on obtient :
JA|CK|__|50|00|00 LD|AS|FP|C9|IO|IO
On constate que des paires de caractères apparaissent dans les deux messages chiffrés, il en va de même dans les messages en clair :
Q9|2D|FP|VX|C9|IO LD|AS|FP|C9|IO|IO
En partant du principe que John connait son salaire, il pourrait deviner le salaire de Jack car la séquence "C9" correspond à "50" et "IO" à "00". John en déduit que le salaire de Jack, chiffré en « C9IOIO » correspond à « 500000 ».
Exemple avec une image
La vulnérabilité est encore plus flagrante sur une image. En effet, les images sont constituées de nombreuses redondances qui font que des blocs sont chiffrés de la même manière en mode ECB. Dans l'exemple ci-dessous, le chiffrement en ECB est réalisé sur des blocs de 4 pixels. On distingue très nettement les formes du Cervin ainsi que les séparations entre les blocs. Avec un mode plus sûr comme CBC ou CTR, l'image a un contenu aléatoire dont on ne peut tirer aucune information a priori. Cela ne veut toutefois pas dire que le chiffrement est sûr, des failles importantes peuvent également apparaître dans des schémas qui produisent des sorties aléatoires mais elles ne sont pas nécessairement liées au mode d'opération.
- Image originale
- Chiffrement en mode ECB
- Chiffrement avec un mode sûr (autre que ECB)
Autres défauts de ECB
ECB a d'autres effets négatifs sur l'intégrité et la protection des données. Ce mode est sensible à des « attaques par répétition » : elles consistent à réinjecter dans le système des données identiques à celles interceptées auparavant. Le but est de modifier le comportement du système ou répéter des actions. Par exemple, le jeu vidéo Phantasy Star Online: Blue Burst utilisait le chiffrement Blowfish en mode ECB. Blowfish est un algorithme robuste mais le mode ECB a été la porte ouverte pour diverses tricheries avec par exemple des joueurs qui envoyaient des paquets chiffrés « ennemi vaincu » à plusieurs reprises. Comme le chiffrement était identique pour tous les paquets de ce type, le serveur déclenchait en conséquence l'attribution de points illégitimes.
Un autre mode aurait pu contrer cela en produisant un chiffrement différent pour chaque paquet. Une modification du flot de données avec un meilleur mode entraîne alors un déchiffrement erroné des données suivantes, une détection de corruption des données ou de fraude est ainsi possible.
Enchaînement des blocs : « Cipher Block Chaining » (CBC)
Dans ce mode, on applique sur chaque bloc un ‘OU exclusif’ avec le chiffrement du bloc précédent avant qu’il soit lui-même chiffré. De plus, afin de rendre chaque message unique, un vecteur d'initialisation (IV) est utilisé.
Ce mode est un chiffrement par bloc.
Défauts de CBC
Un des points négatifs de CBC étant qu'il ne peut pas être parallélisé étant donné que le bloc courant nécessite que le précédent soit chiffré. Il est donc séquentiel.
Selon l'implémentation qui est faite, le mode CBC peut être vulnérable à la méthode "Padding Oracle" qui permet de retrouver les blocs en clair. Le mode CBC étant un mode de chiffrement par bloc, il est nécessaire d'ajouter du "padding" à la fin de chaque bloc non rempli. Avec une compréhension du fonctionnement du "padding" (PKCS7) et en utilisant les mathématiques modernes, il est possible de retrouver l'ensemble du message en clair.
Chiffrement à rétroaction : « Cipher Feedback » (CFB)
Ce mode et les suivants agissent comme un chiffrement par flux. Ils génèrent un flux de clés qui est ensuite appliqué au document original.
Dans ce mode, le flux de clé est obtenu en chiffrant le précédent bloc chiffré. CFB est un chiffrement par flot. Son grand intérêt est qu'il ne nécessite que la fonction de chiffrement, ce qui le rend moins cher à câbler ou programmer pour les algorithmes ayant une fonction de chiffrement différente de la fonction de déchiffrement (exemple: AES).
Chiffrement à rétroaction de sortie : « Output Feedback » (OFB)
Dans ce mode, le flux de clé est obtenu en chiffrant le précédent flux de clé.
C'est un mode de chiffrement de flot qui possède les mêmes avantages que CFB. De plus, il est possible de le pré-calculer en chiffrant successivement le vecteur d'initialisation. Il n'est donc sûr que si la fonction de chiffrement alliée à la clé forment une bonne suite pseudo-aléatoire.
Ce mode est très fragile vis-à-vis d'une attaque au clair. En effet, à l'unique condition de connaître le vecteur d'initialisation d'un message chiffré et de connaitre le clair d'un autre message chiffré, l'attaquant peut reconstituer aisément la chaîne ayant chiffré le premier message et donc déchiffrer ce dernier. Cette fragilité se retrouve dans le mode CFB, à ceci près que seul le premier bloc du message peut être reconstitué de cette manière, l'attaquant a besoin de déchiffrer le message bloc à bloc, en fournissant à chaque fois l'ensemble des blocs précédents, de manière à récupérer la chaîne ayant chiffré le bloc suivant (attaque au clair choisi).
Chiffrement basé sur un compteur : « CounTeR » (CTR)
Dans ce mode, le flux de clé est obtenu en chiffrant les valeurs successives d’un compteur.
Ce mode combine de nombreux avantages, car il permet le chiffrement par flot et est pré-calculable. De plus, il permet un accès aléatoire aux données, est parallélisable et n'utilise que la fonction de chiffrement. Le compteur utilisé peut être une suite pseudo-aléatoire qu'il sera facile de retrouver à partir de la graine (vecteur d'initialisation).
Chiffrement avec vol de texte : « CipherText Stealing » (CTS)
Dans ce mode, applicable à un chiffrement par blocs (ECB, CBC, etc.), les deux derniers blocs sont partiellement combinés de façon à obtenir un message de même taille. Ici, exemple de CTS opérant sur un chiffrement en mode CBC
Les deux derniers blocs sont échangés et combinés en partie, ce qui nécessitera de les obtenir tous les deux pour en déchiffrer un. CTS n'est pas un mode de chiffrement par flot, mais permet d'éviter l'utilisation de bourrage dans les chiffrements par blocs, et donne une taille de message chiffré égale à la taille du message clair. Il est très utilisé dans les protocoles ou formats ne supportant pas une taille quelconque.
Sa contrepartie, opérant sur un déchiffrement en mode CBC:
Chiffrement par propagation des chiffrés en chaine « Propagating Cipher Block Chaining » (PCBC)
OU exclusif-Chiffrement-OU exclusif : « Xor-Encrypt-Xor » (XEX)
Le chiffrement OUX est un chiffrement bit à bit qui utilise les propriétés mathématiques de la fonction OU exclusif notamment cette égalité ; sera le texte à chiffrer et sera la clé de chiffrement.
Voici un exemple illustré avec la lettre F chiffrée avec la clé V :
F correspond au code ASCII 70 représenté par 01110000 en binaire.
V correspond au code ASCII 86 représenté par 10000110 en binaire.
Texte en clair (F en ASCII) | clé (V en ASCII) | Texte chiffré |
---|---|---|
0 | 1 | 1 |
1 | 0 | 1 |
1 | 0 | 1 |
1 | 0 | 1 |
0 | 0 | 0 |
0 | 1 | 1 |
0 | 0 | 0 |
0 | 1 | 1 |
Xex-Tcb-Cts (XTS)
Dans ce mode, la clé est séparée en deux clés de taille égale, de telle sorte que : clé = clé 1 | clé 2.
La lettre i représente le numéro de secteur :
XTS est utilisé par CoreStorage, FreeOTFE, Bestcrypt, dm-crypt et Truecrypt.
IV – Vecteur initial
Tous les modes (à l’exception d’ECB) requièrent un ‘vecteur d’initialisation’. C’est un bloc de données aléatoires pour démarrer le chiffrement du premier bloc et fournir ainsi une forme de hasard indépendant du document à chiffrer. Il n’a pas besoin d’être lui-même chiffré lors de la transmission, mais il ne doit jamais être réemployé avec la même clé.
Propagation d'erreur
Aucun des modes ci-dessus ne protège l’intégrité du message. Il est généralement bien compris que lorsque des données sont chiffrées, il est presque toujours essentiel de fournir un tel mécanisme, car en son absence, les risques sont grands. Pour ce besoin, on peut utiliser un code d’authentification (HMAC) qui protègera le message chiffré et le vecteur d’initialisation.
Avant que ce sentiment ne soit largement partagé, il était fréquent de discuter des caractéristiques de « propagation d’erreur ». Il pouvait être observé, par exemple, qu’un bloc d’erreur dans le message chiffré engendrait un bloc d’erreur lors du déchiffrement en mode ECB, alors qu’en mode CBC, la même erreur affectait deux blocs.
Quoi qu’il en soit, quand une réelle protection d’intégrité est mise en œuvre, de telles erreurs provoqueront (avec une grande probabilité) le rejet du message complet. S'il est souhaitable de tolérer des erreurs aléatoires, le message chiffré devrait se voir appliquer un code de correction d’erreur avant d’être transmis.
À défaut, des modes d’opération sont conçus spécifiquement pour combiner sécurité et authentification, tels que, par exemple XCBC, IACBC, IAPM, OCB, EAX, CWC ou CCM.
Notes et références
- Portail de la cryptologie