Cryptographie!

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!
Pour ces raisons, l'utilisation du mode ECB n'est pas recommandée.
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
    1. le bloc chiffré correspondant, par la formule $c_i=m_i\oplus z_i$;
    2. la clé de contexte suivante, par la formule $z_{i+1}=C_K(c_i)$.
Pour le déchiffrement, on utilise exactement le même algorithme, mais cette fois on retrouve le message initial par la formule $m_i=c_i\oplus z_i$. Avec le mode CFB, on retrouve certaines propriétés du mode CBC, comme par exemple le fait que la modification d'un bloc de texte clair entraîne la modification de tous les blocs chiffrés à partir de celui-ci, faisant de ce mode un mode parfaitement adapté pour préserver l'intégrité des messages.

   Le fonctionnement du mode OFB est tout à fait similaire, mais on applique l'algorithme de chiffrement directement aux clés de contexte :
  • 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
    1. le bloc chiffré correspondant, par la formule $c_i=m_i\oplus z_i$;
    2. la clé de contexte suivante, par la formule $z_{i+1}=C_K(z_i)$.
Ainsi, après s'être mis d'accord sur le bloc d'initialisation, l'émetteur et le récepteur peuvent calculer simultanément, et indépendamment de l'envoi des messages chiffrés, la suite des clés de contexte. Le calcul du "ou exclusif" est lui très rapide et peut se faire facilement en temps réel. Ceci fait du mode OFB un mode bien adapté à ce type d'utilisation, d'autant que la modification d'un bloc du message clair n'entraîne que la modification de ce bloc du message chiffré.

  Dans les modes CFB et OFB, le bloc d'initialisation $\mathbf V$ ne doit pas nécessairement être secret. En revanche, il doit être à usage unique. En effet, si on utilise deux fois le même bloc d'initialisation, on obtient les mêmes problèmes qu'en utilisant deux fois la même clé dans le chiffrement par masque jetable.

  Nous avons décrit ici la version simplifiée des modes CFB et OFB. On peut les utiliser aussi en partageant le message initial avec des blocs plus petits que la taille des blocs de l'algorithme de chiffrement. L'algorithme de fabrication des clés de contexte est alors légèrement modifié. L'algorithme AES est de plus en plus utilisé avec ces deux modes dans les protocoles de communication comme le wifi, bluetooth ou la téléphonie mobile, où il remplace des algorithmes de chiffrement par flots comme RC4.

Consulter aussi