Les chiffrements par blocs - Leur modes opératoires
Les chiffrements par blocs
Les chiffrements par blocs ont un principe très simple. Le texte initial est fragmenté en blocs de n bits.
Pour chaque bloc $x_i$ de n bits, l'algorithme de chiffrement est appliqué pour obtenir un bloc chiffré $y_i$ de même taille.
On remet alors ensembles tous les blocs chiffrés séparément
pour obtenir le message chiffré. Pour le déchiffrement, on fragmente à nouveau le message en blocs de n bits, et pour chaque bloc
on applique l'algorithme de déchiffrement.
Les plus célèbres algorithmes de chiffrement par blocs sont le DES et l'AES. Des modes opératoires
ont été standardisés pour décrire de quelle façon sont appliqués les chiffrements individuels de chaque bloc,
en tenant compte de l'algorithme choisi et de la clé initiale. Nous les étudions maintenant. On suppose
donc qu'on a un algorithme $C_K$ de chiffrement appliqué à des blocs de taille n, $K$ étant la clé.
L'algorithme de déchiffrement associé est $D_L$.
Le mode ECB : carnet de codage électronique
Le mode de chiffrement par carnet de codage électronique, qu'on trouve souvent appelé
mode ECB (de l'anglais Electronic Code Book), est la façon
la plus simple de mettre en oeuvre un chiffrement par blocs. On partage le message initial en blocs $m_1m_2\dots m_r$ de taille n.
On calcule pour chaque bloc $c_i=C_K(m_i)$, et le message chiffré est simplement $c_1\dots c_n$.
Le déchiffrement se fait en calculant pour chaque bloc $D_L(c_i)$.
Ce mode souffre de plusieurs défauts de sécurité :
- Deux blocs clairs identiques sont chiffrés de la même façon. Ceci facilite les attaques statistiques, notamment cela permet de repérer les blocs clairs utilisés les plus fréquemment.
- Le mode ECB ne respecte pas l'intégrité des données. Un attaquant peut remplacer certains blocs chiffrés par d'autres blocs chiffrés du message, ou permuter deux blocs, sans que le destinataire s'en aperçoive. Imaginons que le message chiffré soit le montant d'une transaction électronique, et que l'attaquant arrive à permuter deux chiffres!
Le mode CBC : chiffrement par chaînage de blocs
Le mode de chiffrement par chaînage de blocs, de l'anglais Cipher Block
Chaining, évite les deux problèmes précédents, car désormais le chiffrement dépend du contexte. On commence par fixer
un mot initial de $n$ bits $\bf V$, et on pose $c_0=\bf V$. Le message clair est toujours fractionné en $m_1m_2\dots m_r$.
Le chiffrement du i-ème bloc est alors obtenu par $c_i=C_K(c_{i-1}\oplus m_i)$. Ainsi, il dépend non seulement
du i-ème bloc du message clair, mais aussi du message chiffré précédent.
Pour déchiffrer le message $c_1\dots c_r$, il faut aussi connaitre le mot initial $\mathbf V$. On calcule alors, pour chaque
bloc $i$, $m_i=c_{i-1}\oplus D_L(c_i)$, et on peut prouver que $c_1\dots c_r$ est bien le message initial.
Ce mode a plusieurs avantages, et aussi un gros inconvénient. Le mode CBC chiffre le même message clair différemment avec des blocs
d'initialisation différents. De plus, le chiffrement d'un bloc dépend également des blocs précédents, et par conséquent, si l'ordre des blocs du
cryptogramme est modifié, le déchiffrement est impossible et le destinataire se rend compte du problème. De plus,
si une erreur de transmission affecte le bloc chiffré $c_i$, alors seuls les blocs $m_i$ et $m_{i+1}$ seront affectés,
les autres blocs seront déterminés correctement.
L'inconvénient principal de ce mode est sa lenteur. Imaginons que l'on veuille faire du chiffrement/déchiffrement en temps réel, et en simultané
(cas par exemple d'une communication téléphonique) et
que les algorithmes de chiffrement et de déchiffrement $C_K$ et $D_L$ soient assez longs à mettre en oeuvre. Alors
le destinataire, pour commencer le déchiffrement de $c_{i}$, doit attendre d'avoir terminé celui de $c_{i-1}$.
Ainsi, le temps écoulé entre le chiffrement et le déchiffrement avec le mode CBC peut être trop long pour ce genre d'applications.
Les modes CFB et OFB : chiffrement par rétroaction
Les modes de chiffrement de rétroaction (mode CFB, Cipher Feed Back) et
de rétroaction de sortie (mode OFB, Output Feed Back) ont un esprit très
différent des modes précédents. Il s'agit cette fois d'utiliser la fonction de chiffrement $C_K$ comme un générateur pseudo-aléatoire
de clés, et en essayant de simuler un chiffrement par masque jetable (on n'est d'ailleurs plus vraiment avec ces
deux modes plus vraiment dans le chiffrement par blocs, mais plutôt dans le chiffrement par flots).
Commençons par détailler le mode CFB. On applique l'algorithme suivant :
- on partage le texte en bloc de n bits $m_1m_2\dots m_r$.
- on se donne un bloc d'initialisation de $n$ bits $\mathbf V$, et on pose $z_1=\mathbf V$. Ce bloc $z_1$ est la première clé de contexte.
- pour chaque bloc i, on calcule
- le bloc chiffré correspondant, par la formule $c_i=m_i\oplus z_i$;
- la clé de contexte suivante, par la formule $z_{i+1}=C_K(c_i)$.
- on partage le texte en bloc de n bits $m_1m_2\dots m_r$.
- on se donne un bloc d'initialisation de $n$ bits $\mathbf V$, et on pose $z_1=\mathbf V$. Ce bloc $z_1$ est la première clé de contexte.
- pour chaque bloc i, on calcule
- le bloc chiffré correspondant, par la formule $c_i=m_i\oplus z_i$;
- la clé de contexte suivante, par la formule $z_{i+1}=C_K(z_i)$.
Consulter aussi