Aller au contenu

Chiffrer par blocs : de l’héritage DES à AES

Un chiffrement par blocs transforme un bloc de taille fixe en un autre bloc de même taille, sous le contrôle d’une clé. C’est la brique la plus utilisée de la cryptographie symétrique, et l’une des plus mal comprises : on dit « chiffré en AES » comme si cela décrivait un système, alors que cela décrit seulement ce qui arrive à 16 octets. Ce chapitre présente le bloc comme objet mathématique, les deux grandes architectures internes, l’AES (Advanced Encryption Standard) comme référence pratique, puis la longue cohorte d’algorithmes hérités qu’un inventaire finit toujours par exhumer.

→ Lire l’explication complète de la marmotte

Un chiffrement par blocs se décrit par deux paramètres indépendants. La taille de bloc n fixe la quantité de données traitée à chaque appel : 64 bits pour le DES (Data Encryption Standard) et ses contemporains, 128 bits pour AES. La taille de clé k fixe le nombre de transformations possibles : 56 bits pour DES, 128, 192 ou 256 bits pour AES. La première gouverne les limites d’usage, la seconde la résistance à la recherche exhaustive. Confondre les deux est courant ; une clé de 256 bits ne compense pas un bloc de 64 bits.

Pour une clé fixée, le chiffrement est une permutation de l’ensemble des 2ⁿ blocs possibles : chaque entrée a une sortie unique, et le déchiffrement est la permutation inverse. Le chiffrement par blocs est donc une famille de permutations indexée par la clé.

Un adversaire qui accumulerait toutes les paires (clair, chiffré) pour une clé disposerait du dictionnaire de code complet, le codebook, et n’aurait plus besoin de la clé. Avec des blocs de 128 bits, c’est hors de portée. Avec des blocs de 64 bits, une limite beaucoup plus proche intervient : le paradoxe des anniversaires. Après environ 2³² blocs chiffrés sous une même clé, soit 32 Gio, des collisions de blocs chiffrés apparaissent, et dans les modes chaînés une collision révèle le XOR de deux blocs clairs. L’attaque Sweet32, publiée en 2016, a exploité ce seuil contre 3DES et Blowfish dans HTTPS et OpenVPN, en capturant quelques centaines de gigaoctets de trafic sur une session longue.

La propriété visée s’appelle permutation pseudo-aléatoire (PRP, Pseudo-Random Permutation) : sans la clé, aucun algorithme efficace ne doit distinguer le chiffrement d’une permutation tirée au hasard parmi toutes les permutations possibles. C’est cette définition, et non l’opacité apparente de la sortie, qui permet de prouver ensuite la sécurité des modes construits dessus.

Un message réel dépasse rarement 16 octets. L’appliquer bloc par bloc, indépendamment, est le mode ECB (Electronic Codebook) : déterministe, il chiffre deux blocs identiques en deux blocs identiques et laisse transparaître la structure. Le mode opératoire décide comment enchaîner les blocs, comment injecter un nonce et, dans les modes modernes, comment authentifier. Il est traité dans Transformer un bloc en chiffrement de message. Une primitive de bloc n’est pas un système de chiffrement : c’est un composant.

Claude Shannon a formulé en 1949 les deux objectifs qui guident toute conception. La confusion rend la relation entre clé et chiffré aussi complexe que possible ; elle est assurée par des boîtes de substitution non linéaires, les S-box. La diffusion répand l’influence de chaque bit d’entrée sur l’ensemble du bloc ; elle est assurée par des permutations de bits ou des mélanges linéaires. Une seule ronde est faible ; leur répétition construit la sécurité. Le critère pratique est l’effet avalanche : modifier un bit du clair doit changer en moyenne la moitié des bits du chiffré.

Le réseau de Feistel, utilisé par DES, coupe le bloc en deux moitiés L et R. Chaque ronde calcule L' = R et R' = L ⊕ F(R, Kᵢ), où F est une fonction de ronde quelconque et Kᵢ une sous-clé. L’élégance du schéma tient à ce que F n’a pas besoin d’être inversible : le déchiffrement est le même circuit, avec les sous-clés dans l’ordre inverse. DES compte seize rondes de ce type.

Le SPN (Substitution-Permutation Network), utilisé par AES, transforme le bloc entier à chaque ronde : couche de S-box, couche de diffusion linéaire, ajout de la sous-clé. Toutes les opérations doivent être inversibles, et le déchiffrement emploie les opérations inverses. Le SPN diffuse plus vite par ronde qu’un Feistel, ce qui permet moins de rondes pour une sécurité comparable.

Le nombre de rondes fixe la marge de sécurité : on compare le nombre de rondes que la meilleure attaque connue sait traiter au nombre de rondes réel. Le key schedule, ou cadencement de clé, dérive les sous-clés de chaque ronde à partir de la clé maîtresse. S’il est trop régulier, les rondes deviennent identiques, et l’attaque par glissement (slide attack), publiée par Biryukov et Wagner en 1999, exploite cette auto-similarité : elle cherche des paires de messages décalées d’une ronde et casse le chiffrement indépendamment du nombre de rondes. Ajouter des rondes ne sert alors à rien ; seul un cadencement qui différencie les rondes, par des constantes par exemple, ferme la porte.

AES est l’algorithme Rijndael, conçu par Joan Daemen et Vincent Rijmen, retenu à l’issue d’un concours public et normalisé par le NIST (National Institute of Standards and Technology) dans la norme FIPS 197 en 2001. Son bloc fait toujours 128 bits, organisé en un état de 4 × 4 octets. Les trois variantes ne diffèrent que par la clé et le nombre de rondes :

VarianteCléRondes
AES-128128 bits10
AES-192192 bits12
AES-256256 bits14

Chaque ronde applique quatre opérations. SubBytes remplace chaque octet par sa valeur dans une S-box unique, construite à partir de l’inverse dans le corps fini GF(2⁸) suivi d’une transformation affine, ce qui lui donne de très bonnes propriétés face aux cryptanalyses différentielle et linéaire. ShiftRows décale cycliquement les lignes de l’état. MixColumns mélange chaque colonne par une multiplication matricielle sur GF(2⁸). AddRoundKey XORe la sous-clé. La dernière ronde omet MixColumns. Après deux rondes, chaque octet de sortie dépend de chaque octet d’entrée.

Vingt-cinq ans d’analyse publique n’ont produit aucune attaque pratique sur AES complet. Les meilleurs résultats, comme l’attaque biclique de 2011 qui ramène la recherche de clé AES-128 à environ 2¹²⁶ opérations, ou les attaques à clés liées sur AES-256, restent académiques : le gain est minime ou le modèle d’attaque irréaliste pour un usage correct.

Accélération matérielle et implémentation constante

Section intitulée « Accélération matérielle et implémentation constante »

Les processeurs x86 disposent depuis 2010 des instructions AES-NI (AES New Instructions), et les processeurs ARM récents d’extensions équivalentes. Elles exécutent une ronde entière en une instruction, en temps constant, et portent le débit à plusieurs gigaoctets par seconde par cœur. Sans elles, une implémentation logicielle naïve utilise des tables indexées par des octets dépendant de la clé ; les accès au cache varient alors avec le secret, et les attaques par cache publiées depuis 2005 ont montré qu’on pouvait en extraire la clé. Une implémentation logicielle sûre doit être écrite en temps constant, par exemple par technique de bitslicing, ce qui relève du travail de spécialistes et de bibliothèques éprouvées, sujet développé dans Quand l’implémentation parle.

Une API qui expose « AES » sans mode, ou qui choisit ECB par défaut, est un piège. L’usage correct passe par une construction AEAD (Authenticated Encryption with Associated Data) comme AES-GCM, qui fournit nonce, chiffrement et authentification d’un seul tenant ; voir Chiffrer et authentifier en une seule construction.

DES, publié en 1977, a structuré trente ans de cryptographie. Ses S-box avaient été durcies contre la cryptanalyse différentielle, que Biham et Shamir ont rendue publique en 1990 ; IBM a confirmé en 1994 la connaître dès la conception. Cette attaque demande 2⁴⁷ clairs choisis contre DES complet. La cryptanalyse linéaire de Matsui, en 1993, descend à 2⁴³ clairs connus. Ni l’une ni l’autre n’a tué DES : c’est la clé de 56 bits qui l’a fait, quand la machine Deep Crack de l’EFF (Electronic Frontier Foundation) a retrouvé une clé en 56 heures en 1998.

Le 3DES applique DES trois fois (chiffrement, déchiffrement, chiffrement) avec deux ou trois clés. Sa clé nominale de 168 bits n’offre qu’environ 112 bits de sécurité à cause de l’attaque par rencontre au milieu, détaillée dans Choisir, combiner et migrer, et son bloc de 64 bits l’expose à Sweet32. Le NIST a interdit son emploi pour chiffrer de nouvelles données après 2023, en ne tolérant plus que le déchiffrement de données existantes. DESX, qui ajoute un blanchiment de clé, relève de la même famille historique.

Familles expérimentales et algorithmes propriétaires

Section intitulée « Familles expérimentales et algorithmes propriétaires »

Les décennies 1970 à 1990 ont produit une floraison d’algorithmes, aujourd’hui utiles pour comprendre l’histoire et pour reconnaître ce qu’un vieux système emploie encore.

AlgorithmeBlocStatut pour un inventaire
Lucifer (IBM)selon les versionshistorique, précurseur de DES
FEAL64 bitscassé, cas d’école de la cryptanalyse différentielle
IDEA64 bitshistorique, présent dans d’anciennes versions de PGP
GOST 28147-8964 bitshérité, bloc trop court
CAST-12864 bitshérité, présent dans OpenPGP
Blowfish64 bitshérité, bloc trop court, Sweet32
RC264 bitsà retirer, présent dans d’anciens S/MIME et PKCS#12
RC5paramétrablehistorique
Skipjack (NSA)64 bitshistorique, clé de 80 bits
Madryga, NewDES, LOKI, SAFER, Khufu et Khafre, REDOC, MMB, 3-Way, CRAB, CA, SXAL et MBALdiversmatériau d’étude, sans usage légitime nouveau

Le dénominateur commun est le bloc de 64 bits, qui suffit à les écarter de tout usage neuf indépendamment de leur cryptanalyse propre. Les algorithmes propriétaires, dont la conception n’a pas été publiée, ajoutent un défaut : leur sécurité n’a jamais été évaluée publiquement, et ceux qu’on a fini par rétro-concevoir ont rarement résisté. Lire le code d’un ancien logiciel pour identifier l’algorithme qu’il emploie est légitime ; recopier ce code dans un outil de migration l’est beaucoup moins, pour des raisons de licence comme de qualité. Mieux vaut une bibliothèque maintenue qui expose encore l’algorithme en lecture, souvent dans un module explicitement nommé « legacy », comme le fournisseur legacy d’OpenSSL 3.

Le retrait suit trois étapes. L’inventaire recense chaque usage : protocoles négociés, formats de fichiers, archives, sauvegardes, équipements. La dépréciation interdit les nouveaux usages tout en conservant le déchiffrement. Le rechiffrement transfère les données anciennes vers une construction moderne, puis le dernier chemin de lecture est supprimé. La démarche complète figure dans Gouverner la cryptographie.

Fenêtre de terminal
# Un fichier de blocs répétés, chiffré en ECB puis en CBC
python3 -c "import sys; sys.stdout.buffer.write(b'A'*16*8)" > clair.bin
K=000102030405060708090a0b0c0d0e0f
openssl enc -aes-128-ecb -K $K -nopad -in clair.bin | xxd | head -4
openssl enc -aes-128-cbc -K $K -iv 0f0e0d0c0b0a09080706050403020100 -nopad -in clair.bin | xxd | head -4

En ECB, les huit blocs chiffrés sont identiques ligne après ligne. Appliqué à une image bitmap, le même effet laisse la silhouette parfaitement visible. En CBC, chaque bloc diffère. Aucune des deux sorties n’est authentifiée, ce qui rappelle que CBC corrige la répétition, pas l’altération.

Fenêtre de terminal
openssl list -cipher-algorithms | grep -i -E 'aes|des|bf|rc2'
grep -o -m1 -w aes /proc/cpuinfo # présence d'AES-NI

La liste montre ce que la bibliothèque accepte encore, souvent bien plus que ce qu’une politique autorise. Sous OpenSSL 3, DES, RC2 ou Blowfish ne fonctionnent qu’en chargeant explicitement le fournisseur legacy, signal utile lors d’un inventaire.

Un format de fichier chiffré en 3DES-CBC, sans authentification, se migre ainsi : ajouter au format un octet de version, 0x01 pour l’ancien, 0x02 pour AES-256-GCM ; faire lire les deux versions par le code, n’écrire que la version 2 ; rechiffrer par lots les fichiers existants en vérifiant chaque résultat ; mesurer la proportion restante en version 1 ; supprimer le chemin de lecture 3DES quand elle atteint zéro, archives comprises. Le document de migration consigne pour chaque étape la date, le périmètre et le moyen de vérifier.

Utiliser ECB en production reste fréquent, parce que c’est le mode par défaut de certaines API ; le résultat fuit la structure des données. Implémenter AES à la main, même à partir de la norme, produit en général un code juste mais vulnérable aux canaux auxiliaires. Choisir AES-256 pour masquer une gestion de clés défaillante revient à blinder une porte dont la clé pend à la poignée : la sécurité réelle est celle de l’endroit où la clé est stockée. Garder un ancien algorithme parce qu’il figure encore dans une bibliothèque confond disponibilité et recommandation.

AES est une permutation de 16 octets ; AES-GCM est un système de chiffrement authentifié construit dessus. Un bloc est l’unité de traitement de la primitive, un message en contient autant qu’il faut. Un algorithme historique s’étudie, un standard recommandé s’emploie ; le premier peut rester sûr en théorie et inadapté en pratique, comme IDEA avec son bloc de 64 bits. Enfin, une cryptanalyse académique qui gagne deux bits sur 128 réduit une marge, elle ne fournit pas une attaque exploitable : la distinction est développée dans Comprendre la cryptanalyse.

Tant qu’un ancien algorithme reste accepté quelque part, la protection réelle d’un échange est celle du plus faible que les deux parties savent encore parler : un attaquant placé au milieu n’a qu’à faire croire que l’autre côté ne connaît que celui-là. Un retrait sans inventaire laisse un second angle mort : les archives, sauvegardes et fichiers chiffrés avec l’ancien algorithme gardent son niveau de protection jusqu’à ce qu’on les rechiffre, quelle que soit la modernité des nouveaux flux. La ruche a changé la serrure de la porte principale et oublié que les vieilles clés ouvrent encore la cave.

Un chiffrement par blocs prend un morceau de données de taille fixe, par exemple 128 bits (un bit est un chiffre 0 ou 1), et le transforme en un autre morceau de même taille à l’aide d’une clé. Pour une clé donnée, la transformation est une permutation : chaque entrée possible correspond à une seule sortie, et on peut revenir en arrière avec la même clé. Pour être sûre, cette transformation doit paraître aléatoire à qui ne connaît pas la clé. On l’obtient en répétant plusieurs tours de deux opérations : remplacer des groupes de bits par d’autres selon une table fixe, ce qui brouille le lien avec la clé, puis déplacer ces bits, ce qui répand chaque changement sur tout le bloc. AES, le « standard de chiffrement avancé » utilisé aujourd’hui, fonctionne ainsi avec des clés de 128, 192 ou 256 bits, souvent accéléré par le processeur lui-même. Un bloc ne suffit pas pour un long message : appliqué bloc par bloc sans précaution, deux blocs identiques donnent deux résultats identiques, et la structure du message reste visible. Il faut donc une règle d’enchaînement des blocs, appelée mode opératoire, et ne jamais écrire soi-même le chiffrement. Les anciens algorithmes, comme DES, l’ancien standard de chiffrement des données, ne sont plus recommandés : on les inventorie, puis on les retire progressivement au profit de méthodes modernes qui chiffrent et vérifient en même temps.

À lire aussi

Pages voisines

: les deux pages se citent l’une l’autre.