Publication initiale : 4 juillet 2025
À savoir avant de commencer :
L'algorithme AES‑256 (AES pour Advanced Encryption Standard) est utilisé pour le chiffrement de données secrètes transmises d'un émetteur à un destinataire sous forme de texte chiffré basé sur l'utilisation d'une clé symétrique de chiffrement déjà connue à l'avance des deux parties. L'algorithme, développé au début des années 2000 par les cryptographes belges Joan Daemen et Vincent Rijmen, est aussi connu sous le nom de Rijndael, résultat de la contraction du nom de ses deux créateurs.
L'utilisation d'une clé de chiffrement par l'algorithme fait en sorte qu'il est impossible reconstituer le texte secret original en partant du texte chiffré si on ne connaît pas la clé.
L'algorithme AES‑256 fait partie de la famille AES qui comprend aussi les algorithmes AES‑128 et AES‑192. Le mode de fonctionnement de ceux-ci est le même que AES‑256, mais avec certaines valeurs différentes de paramètres, notamment la longueur de la clé. Les algorithmes AES‑128 et AES‑192 seront mentionnés plus loin à quelques reprises mais la majeure partie de l'article portera sur AES‑256.
Voyons un exemple de chiffrement avec l'algorithme AES‑256 à l'aide du texte « Bonjour tous les amis! ». Avant de l'aborder, prendre note que la notation hexadécimale y est très utilisée de manière à mieux représenter le traitement fait par l'algorithme, qui fonctionne par octets et par bits. À noter aussi que le texte chiffré est plus long que le texte original car l'algorithme produit des résultats dont la longueur est un multiple de 16 octets (ou 128 bits).
Clé de chiffrement (256 bits, notation hexadécimale) :
D2C3F2EE 570704B3 4C27EE02 2AF1C43B
Texte à chiffrer : Bonjour tous les amis!
Notation hexadécimale :
B o n j o u r · t o u s · l e s · a m i s !
426F6E6A 6F757220 746F7573 206C6573 20616D69 7321
Texte chiffré :
1C85547F A9A9AE7E E4DC9130 77C6299F D70BF7AD 2A4E4059 8CBFFC76 74BE0ADF
Comparaison pour lettre o :
B o n j o u r · t o u s · l e s · a m i s !
1C85547F A9A9AE7E E4DC9130 77C6299F D70BF7AD 2A4E4059 8CBFFC76 74BE0ADF
Comparaison pour espace (· ) :
B o n j o u r · t o u s · l e s · a m i s !
1C85547F A9A9AE7E E4DC9130 77C6299F D70BF7AD 2A4E4059 8CBFFC76 74BE0ADF
Comparaison pour lettre s :
B o n j o u r · t o u s · l e s · a m i s !
1C85547F A9A9AE7E E4DC9130 77C6299F D70BF7AD 2A4E4059 8CBFFC76 74BE0ADF
On peut remarquer dans l'exemple que les caractères qui se répètent (les lettres o et s, et l'espace [· ] ) donnent un résultat différent à chaque fois.
On ne peut pas ainsi deviner que le o, par exemple, a été remplacé par le même caractère à chaque fois. On ne peut pas déterminer non plus qu'il a été déplacé ailleurs dans le texte.
Il n'est même pas possible de reconstituer le texte original en utilisant le seul texte chiffré par lui-même. Pour pouvoir le déchiffrer il faut avoir la clé. Une personne malintentionnée qui ne connaît pas la valeur de la clé devra tenter d'en deviner la valeur par différents moyens (mots de passe faibles, attaque par dictionnaire, attaque par force brute, etc.). Le principe d'avoir une clé commune dont la valeur est connue à la fois de l'émetteur et du destinataire (et personne d'autre!) fait en sorte que la clé est « symétrique » comme mentionné en début d'article.
La clé de chiffrement pour l'algorithme a une longueur de de 256 bits, ce qui est reflété dans la partie numérique du nom de l'algorithme.
Avant de commencer le chiffrement, l'algorithme procède à la génération de 16 clés de transformation, d'une longueur de 128 bits chacune. Cette opération se fait pas paires de clés. Les deux premières clés sont mises à jour avec les valeurs des deux moitiés de la clé initiale de chiffrement, appelée ici Kinit, qui est d'une longueur de 256 bits. Ensuite, chaque paire de clés propage des nouvelles valeurs à conserver dans la prochaine paire de clés.
Le traitement utilisé pour déterminer les nouvelles valeurs de clés d'une paire à l'autre est passablement complexe. Pour les lecteurs qui veulent en savoir davantage, les détails à ce sujet sont présentés à l'annexe A (Détails sur la génération des clés de transformation).
L'algorithme AES‑256 dans sa forme la plus simple consiste sommairement à séparer le texte brut, qui peut avoir une longueur quelconque, en blocs de 128 bits (16 caractères ou octets) disposés conceptuellement en 4 rangées et 4 colonnes, et à appliquer le chiffrement sur ceux-ci en employant les clés de transformation (la clé K15 n'est pas utilisée).
L'opération de chiffrement individuel sur un bloc de 128 bits commence par un OU exclusif entre ce bloc et la clé de transformation K0 (dont la longueur est également de 128 bits). Par la suite, une application successive de 14 rondes de transformation est effectuée sur le bloc. Les rondes sont numérotées de 1 à 14 et chaque ronde utilise la clé de transformation avec le même numéro.
Dans une ronde de transformation, les opérations suivantes sont appliquées successivement au bloc de 128 bits :
Pour les lecteurs qui veulent en savoir plus, une description plus approfondie des opérations effectuées lors d'une ronde de transformation est donnée à la section 4 (Détail des opérations d'une ronde de transformation d'un bloc).
Le déchiffrement fait par le destinataire d'un texte chiffré par un émetteur consiste à appliquer, sauf pour le OU exclusif, les mêmes opérations que celles employées pour le chiffrement, mais en utilisant un procédé inverse.
Pour que le déchiffrement puisse être mené à bien, le destinataire doit disposer de la même clé de chiffrement que l'émetteur afin de pouvoir générer les mêmes clés de transformation.
L'algorithme AES-256 peut être utilisé selon plusieurs modes dont quelques-uns sont présentés dans cette section.
Le mode ECB est essentiellement celui présenté en début de section précédente. Avec celui-ci, les blocs de 128 bits sont chiffrés indépendamment les uns les autres. Il s'agit du mode le plus simple mais aussi le plus vulnérable. En particulier, si deux blocs du texte brut ont le même contenu avant chiffrement, ceux-ci auront aussi le même contenu après chiffrement, une situation à éviter. En raison de ces désavantages, le mode ECB est très peu utilisé dans la pratique courante.
Dans ce mode, le résultat du chiffrement du bloc 1 est utilisé en entrée au chiffrement du bloc 2 en le combinant au préalable par un OU exclusif au contenu du texte brut pour le bloc 2. Le même principe est appliqué pour passer du bloc 2 au bloc 3 et ainsi de suite. Un OU exclusif est également employé au départ pour chiffrer le bloc 1, en utilisant un « vecteur d'initialisation » (IV, de l'anglais Initialization Vector) qui est en fait un nombre aléatoire.
Le vecteur IV est de la même longueur qu'un bloc (128 bits) et est connu à la fois de l'émetteur et du destinataire. Le vecteur IV n'a pas besoin d'être secret. Le mode CBC offre plus de robustesse que le mode ECB mais est en revanche plus lent car il faut traiter séquentiellement les blocs, un désavantage que n'a pas le mode ECB, qui permet un traitement en parallèle des blocs.
Dans ce mode, le chiffrement ne se fait pas sur le texte brut lui-même mais sur la combinaison d'un nombre aléatoire avec un compteur; par la suite un OU exclusif du résultat du chiffrement est effectué avec le texte brut, bloc par bloc. Le compteur est incrémenté en passant d'un bloc à l'autre.
Le nombre aléatoire n'est pas secret mais doit être différent à chaque nouvelle transmission de message au cours d'une même session. Le nombre aléatoire et le compteur peuvent avoir une longueur quelconque mais le total des deux données jointes bout à bout ensemble (i.e. concaténation) devrait être de 128 bits.
Le mode CTR offre l'avantage de la robustesse tout en permettant le parallélisme. Même si le chiffrement porte sur une donnée qui varie peu d'un bloc à l'autre (i.e. incrémentation d'un compteur), cela n'a pas d'impact car le chiffrement avec l'algorithme AES-256 est conçu de manière à donner des résultats très différents, même entre deux données presque semblables.
Le mode GCM est une extension du mode CTR décrit à la section précédente, à laquelle est ajouté un traitement pour produire un code d'authentification de message MAC (de l'anglais Message Authentication Code) permettant de s'assurer de la bonne identité de l'émetteur et aussi de vérifier l'intégrité des données dans le cas où elles auraient été corrompues suite à une défaillance technique quelconque dans la communication. Le mode GCM fait partie de la classe avancée AE (pour Authenticated Encryption) pour l'algorithme AES-256.
Le mode GCM est plus complexe que les autres modes et fait appel à la théorie des corps finis développée par le mathématicien éponyme Évariste Galois au début du XIXe siècle.
Le déroulement décrit de façon très sommaire pour le mode GCM est présenté dans les étapes qui suivent.
L'émetteur procède au chiffrement par blocs du texte secret en utilisant le mode CTR de la même manière que celle indiquée à la section précédente, avec un vecteur d'initialisation (IV) comme nombre aléatoire et un compteur. Dans la pratique courante, le vecteur IV est différent à chaque transmission de données, même à l'intérieur d'une même session entre l'émetteur et le récepteur, de manière à éviter de possibles répétitions de données qui pourraient donner des indices à des observateurs externes inopportuns.
La longueur de la combinaison du vecteur IV et du compteur doit être de 128 bits.
L'émetteur définit également des données additionnelles d'authentification (AAD, de l'anglais Additional Authenticated Data) de son choix (ex. : adresse IP) en préparation de la production du code MAC.
L'opération se déroule en trois parties. L'émetteur effectue d'abord un chiffrement dans un simple bloc de 128 bits du vecteur IV en appliquant les 15 rondes de transformation comme indiqué précédemment à la section 2.3.
L'émetteur procède ensuite à une opération particulière de multiplication entre les valeurs dans les blocs de 128 bits et celles contenues dans les données AAD. Sans trop entrer dans des détails qui peuvent être complexes, cette multiplication, basée sur la théorie des corps finis, permet d'avoir un résultat de 128 bits unique et quasi-aléatoire d'une fois à l'autre. Il est possible d'en savoir un peu plus concernant l'utilisation des corps finis pour l'algorithme AES‑256 en se référant à l'annexe B (Utilisation des corps finis avec l'algorithme).
Une fois la multiplication complétée, un OU exclusif est effectué avec le résultat de celle-ci et le vecteur IV chiffré dans un bloc de 128 bits. Le résultat de l'opération constitue le code MAC.
Lorsque l'émetteur a terminé sa tâche, l'émetteur envoie au destinataire les données qu'il a préparées : texte chiffré en blocs, le code MAC, le vecteur IV et les données AAD.
Le destinataire procède au déchiffrement du texte en utilisant le mode CTR, tel qu'expliqué plus tôt à la section 3.3, en employant le vecteur IV comme nombre aléatoire et un compteur comme l'a fait l'émetteur. Le déchiffrement est fait selon le procédé inverse du chiffrement tel que décrit à la section 2.5, pour chaque ronde de transformation et pour chaque bloc de 128 bits.
Après avoir déchiffré le texte, le destinataire produit le code MAC exactement de la même manière que l'émetteur : en chiffrant le vecteur IV reçu, en applicant la multiplication dans un corps fini des données AAD et du texte chiffré reçus, puis en faisant un OU exclusif entre le vecteur IV chiffré de 128 bits et le résultat sur 128 bits de la multiplication dans un corps fini.
Le destinataire compare le code MAC de vérification qu'il vient de produire avec celui qu'il a reçu de l'émetteur. Si les deux codes sont identiques, l'identité de l'émetteur est confirmée.
Une différence entre les codes MAC indique que l'une ou l'autre des données reçues a été altérée soit par une défectuosité dans le lien entre l'émetteur et le destinataire, soit par une intervention malveillante. Dans tous les cas, le destinataire devrait mettre fin à la session.
La présente section donne une description détaillée des opérations effectuées lors d'une ronde de transformation d'un bloc de 128 bits présentées précédemment en aperçu de haut niveau à la section 2.4. Quelques connaissances concernant les matrices en mathématiques peuvent être utiles pour la compréhension de certaines parties de cette section.
À titre de rappel, une ronde de transformation de bloc est constituée des opérations suivantes :
Cette opération consiste à substituer chaque caractère du bloc par un caractère correspondant en utilisant à cette fin un tableau prédéfini, qu'on retrouve souvent sous le nom « S-box » (de l'anglais Substitution box) dans la documentation spécialisée au sujet d'AES-256.
Le tableau S-box est montré ci-dessous; les valeurs indiquées sont en notation hexadécimale. Les rangées correspondent aux 4 bits les plus significatifs du caractère à substituer et les colonnes correspondent aux 4 bits les moins significatifs du caractère. En suivant ce principe, on obtient bel et bien le caractère 6D comme caractère de substitution pour B3 dans le cas de l'exemple.
_0 | _1 | _2 | _3 | _4 | _5 | _6 | _7 | _8 | _9 | _A | _B | _C | _D | _E | _F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0_ | 63 | 7C | 77 | 7B | F2 | 6B | 6F | C5 | 30 | 01 | 67 | 2B | FE | D7 | AB | 76 |
1_ | CA | 82 | C9 | 7D | FA | 59 | 47 | F0 | AD | D4 | A2 | AF | 9C | A4 | 72 | C0 |
2_ | B7 | FD | 93 | 26 | 36 | 3F | F7 | CC | 34 | A5 | E5 | F1 | 71 | D8 | 31 | 15 |
3_ | 04 | C7 | 23 | C3 | 18 | 96 | 05 | 9A | 07 | 12 | 80 | E2 | EB | 27 | B2 | 75 |
4_ | 09 | 83 | 2C | 1A | 1B | 6E | 5A | A0 | 52 | 3B | D6 | B3 | 29 | E3 | 2F | 84 |
5_ | 53 | D1 | 00 | ED | 20 | FC | B1 | 5B | 6A | CB | BE | 39 | 4A | 4C | 58 | CF |
6_ | D0 | EF | AA | FB | 43 | 4D | 33 | 85 | 45 | F9 | 02 | 7F | 50 | 3C | 9F | A8 |
7_ | 51 | A3 | 40 | 8F | 92 | 9D | 38 | F5 | BC | B6 | DA | 21 | 10 | FF | F3 | D2 |
8_ | CD | 0C | 13 | EC | 5F | 97 | 44 | 17 | C4 | A7 | 7E | 3D | 64 | 5D | 19 | 73 |
9_ | 60 | 81 | 4F | DC | 22 | 2A | 90 | 88 | 46 | EE | B8 | 14 | DE | 5E | 0B | DB |
A_ | E0 | 32 | 3A | 0A | 49 | 06 | 24 | 5C | C2 | D3 | AC | 62 | 91 | 95 | E4 | 79 |
B_ | E7 | C8 | 37 | 6D | 8D | D5 | 4E | A9 | 6C | 56 | F4 | EA | 65 | 7A | AE | 08 |
C_ | BA | 78 | 25 | 2E | 1C | A6 | B4 | C6 | E8 | DD | 74 | 1F | 4B | BD | 8B | 8A |
D_ | 70 | 3E | B5 | 66 | 48 | 03 | F6 | 0E | 61 | 35 | 57 | B9 | 86 | C1 | 1D | 9E |
E_ | E1 | F8 | 98 | 11 | 69 | D9 | 8E | 94 | 9B | 1E | 87 | E9 | CE | 55 | 28 | DF |
F_ | 8C | A1 | 89 | 0D | BF | E6 | 42 | 68 | 41 | 99 | 2D | 0F | B0 | 54 | BB | 16 |
Il existe également un « tableau S-box inversé » contenant des valeurs différentes, non montré ici, pour faire la substitution en sens inverse lors du déchiffrement.
Dans certaines installations, le tableau S-box n'est pas implanté pour des raisons de sécurité. Dans un tel cas un traitement plus complexe, qui utilise la théorie ses corps finis, est effectué dynamiquement à chaque fois pour produire l'équivalent du tableau S-box pour un caractère donné. Plus de détails à ce sujet peuvent être obtenus à l'annexe C (Substitution de caractères sans tableau).
Pour cette opération, le décalage vers la gauche se fait de façon circulaire sur les rangées du bloc de 128 bits. Il n'y a pas de décalage pour la rangée 1 mais les autres rangées sont soumises à un décalage augmentant en nombre d'octets en passant d'une rangée à l'autre. Ainsi la rangée 2 est décalée de 1 octet, pour la rangée 3 le décalage est de 2 octets et pour la rangée 4, 3 octets.
Pour le déchiffrement, l'opération se fait en sens inverse, vers la droite.
Cette opération, la plus complexe dans une ronde de transformation, consiste à appliquer pour chaque colonne du bloc de 128 bits un produit matriciel entre une matrice M de dimension 4 X 4, contenant les coefficients 02, 03, 01 et 01 déjà établis à l'avance par les concepteurs de l'algorithme, et la colonne (qui est de dimension 4 X 1).
Les coefficients dans la matrice M se répètent d'une rangée à l'autre sauf que ceux-ci sont décalés d'une position vers la droite en changeant de rangée. Une matrice arrangée de cette sorte est dite « circulaire ».
Le développement terme à terme du produit matriciel, identifié par la partie S dans l'exemple ci-dessus, est décrit plus en détail à la prochaine section.
La multiplication à la base du produit matriciel employé pour le mélange des valeurs consiste en une multiplication dans un corps fini dont plus de détails sont donnés plus loin à la section 4.3.2.
Comme nous venons de voir dans l'exemple montré plus haut, le contenu de la partie S représentant le développement terme à terme du produit matriciel est passablement complexe.
Plutôt que de se référer au formalisme de l'algèbre matricielle avec laquelle il pourrait être facile de s'y perdre pour voir comment on arrive à la partie S, utilisons une astuce visuelle. Celle-ci consiste à déterminer le contenu de la partie S, qu'on peut conceptualiser comme une « surface de travail », à partir de la matrice M de dimension 4 X 4 et de la colonne C de dimension 4 X 1. Les étapes de la « recette » sont présentées ci-dessous.
1. Faire pivoter de 90° dans le sens anti-horaire la colonne C de manière à avoir un en-tête pour la surface de travail. Déplacer vers la droite le crochet droit de C de manière à délimiter la surface de travail :
2. Reproduire le contenu complet de M dans S :
3. Dupliquer dans les colonnes correspondantes de S les valeurs provenant initialement de C mises en en-tête :
4. Insérer les opérateurs dans S!
À ce point-ci le développement terme à terme est complété et prêt au calcul des résultats. Reprenons le procédé avec l'exemple de la figure 16 montré plus haut.
1. Faire pivoter la colonne C.
2. Reproduire le contenu complet de M dans S.
3. Dupliquer dans les colonnes correspondantes les valeurs provenant initialement de C mises en en-tête.
4. Insérer les opérateurs.
En appliquant ensuite la multiplication pour chaque paire des termes, puis en additionnant (par un OU exclusif) ces résultats intermédiaires rangée par rangée, on obtient le résultat final de la multiplication pour une colonne.
La multiplication dans un corps fini pour le mélange des valeurs dans une colonne doit être appliquée entre chaque cellule de la matrice de coefficients et chaque octet de la colonne. Il s'agit d'une opération fort complexe qui peut toutefois être contournée en utilisant des tableaux de multiplication déjà existants prévus à cette fin. Certains détails concernant l'utilisation des corps finis pour l'algorithme AES‑256 sont donnés dans l'annexe B (Utilisation des corps finis avec l'algorithme).
Pour les paires avec le multiplicande 01, aucun tableau n'est nécessaire car le résultat est le même que le multiplicateur. Par exemple pour la paire (01· B3), le résultat est B3.
Si on veut faire le calcul pour la paire (02· 8E) de l'exemple, on utilise le tableau montré un peu plus bas pour la valeur 02.
Dans le tableau, les rangées correspondent aux 4 bits les plus significatifs du multiplicateur 8E et les colonnes correspondent à ses 4 bits les moins significatifs, ce qui permet d'obtenir le résultat 07 pour (02· 8E).
_0 | _1 | _2 | _3 | _4 | _5 | _6 | _7 | _8 | _9 | _A | _B | _C | _D | _E | _F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0_ | 00 | 02 | 04 | 06 | 08 | 0A | 0C | 0E | 10 | 12 | 14 | 16 | 18 | 1A | 1C | 1E |
1_ | 20 | 22 | 24 | 26 | 28 | 2A | 2C | 2E | 30 | 32 | 34 | 36 | 38 | 3A | 3C | 3E |
2_ | 40 | 42 | 44 | 46 | 48 | 4A | 4C | 4E | 50 | 52 | 54 | 56 | 58 | 5A | 5C | 5E |
3_ | 60 | 62 | 64 | 66 | 68 | 6A | 6C | 6E | 70 | 72 | 74 | 76 | 78 | 7A | 7C | 7E |
4_ | 80 | 82 | 84 | 86 | 88 | 8A | 8C | 8E | 90 | 92 | 94 | 96 | 98 | 9A | 9C | 9E |
5_ | A0 | A2 | A4 | A6 | A8 | AA | AC | AE | B0 | B2 | B4 | B6 | B8 | BA | BC | BE |
6_ | C0 | C2 | C4 | C6 | C8 | CA | CC | CE | D0 | D2 | D4 | D6 | D8 | DA | DC | DE |
7_ | E0 | E2 | E4 | E6 | E8 | EA | EC | EE | F0 | F2 | F4 | F6 | F8 | FA | FC | FE |
8_ | 1B | 19 | 1F | 1D | 13 | 11 | 17 | 15 | 0B | 09 | 0F | 0D | 03 | 01 | 07 | 05 |
9_ | 3B | 39 | 3F | 3D | 33 | 31 | 37 | 35 | 2B | 29 | 2F | 2D | 23 | 21 | 27 | 25 |
A_ | 5B | 59 | 5F | 5D | 53 | 51 | 57 | 55 | 4B | 49 | 4F | 4D | 43 | 41 | 47 | 45 |
B_ | 7B | 79 | 7F | 7D | 73 | 71 | 77 | 75 | 6B | 69 | 6F | 6D | 63 | 61 | 67 | 65 |
C_ | 9B | 99 | 9F | 9D | 93 | 91 | 97 | 95 | 8B | 89 | 8F | 8D | 83 | 81 | 87 | 85 |
D_ | BB | B9 | BF | BD | B3 | B1 | B7 | B5 | AB | A9 | AF | AD | A3 | A1 | A7 | A5 |
E_ | DB | D9 | DF | DD | D3 | D1 | D7 | D5 | CB | C9 | CF | CD | C3 | C1 | C7 | C5 |
F_ | FB | F9 | FF | FD | F3 | F1 | F7 | F5 | EB | E9 | EF | ED | E3 | E1 | E7 | E5 |
Et si on veut faire le calcul pour la paire (03· D4) de l'exemple, on utilise le tableau pour la valeur 03, montrée un peu plus bas.
En accédant à la rangée correspondant aux 4 bits les plus significatifs du multiplicateur D4 et la colonne correspondant à ses 4 bits les moins significatifs, on obtient le résultat 67 pour (03· D4).
_0 | _1 | _2 | _3 | _4 | _5 | _6 | _7 | _8 | _9 | _A | _B | _C | _D | _E | _F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0_ | 00 | 03 | 06 | 05 | 0C | 0F | 0A | 09 | 18 | 1B | 1E | 1D | 14 | 17 | 12 | 11 |
1_ | 30 | 33 | 36 | 35 | 3C | 3F | 3A | 39 | 28 | 2B | 2E | 2D | 24 | 27 | 22 | 21 |
2_ | 60 | 63 | 66 | 65 | 6C | 6F | 6A | 69 | 78 | 7B | 7E | 7D | 74 | 77 | 72 | 71 |
3_ | 50 | 53 | 56 | 55 | 5C | 5F | 5A | 59 | 48 | 4B | 4E | 4D | 44 | 47 | 42 | 41 |
4_ | C0 | C3 | C6 | C5 | CC | CF | CA | C9 | D8 | DB | DE | DD | D4 | D7 | D2 | D1 |
5_ | F0 | F3 | F6 | F5 | FC | FF | FA | F9 | E8 | EB | EE | ED | E4 | E7 | E2 | E1 |
6_ | A0 | A3 | A6 | A5 | AC | AF | AA | A9 | B8 | BB | BE | BD | B4 | B7 | B2 | B1 |
7_ | 90 | 93 | 96 | 95 | 9C | 9F | 9A | 99 | 88 | 8B | 8E | 8D | 84 | 87 | 82 | 81 |
8_ | 9B | 98 | 9D | 9E | 97 | 94 | 91 | 92 | 83 | 80 | 85 | 86 | 8F | 8C | 89 | 8A |
9_ | AB | A8 | AD | AE | A7 | A4 | A1 | A2 | B3 | B0 | B5 | B6 | BF | BC | B9 | BA |
A_ | FB | F8 | FD | FE | F7 | F4 | F1 | F2 | E3 | E0 | E5 | E6 | EF | EC | E9 | EA |
B_ | CB | C8 | CD | CE | C7 | C4 | C1 | C2 | D3 | D0 | D5 | D6 | DF | DC | D9 | DA |
C_ | 5B | 58 | 5D | 5E | 57 | 54 | 51 | 52 | 43 | 40 | 45 | 46 | 4F | 4C | 49 | 4A |
D_ | 6B | 68 | 6D | 6E | 67 | 64 | 61 | 62 | 73 | 70 | 75 | 76 | 7F | 7C | 79 | 7A |
E_ | 3B | 38 | 3D | 3E | 37 | 34 | 31 | 32 | 23 | 20 | 25 | 26 | 2F | 2C | 29 | 2A |
F_ | 0B | 08 | 0D | 0E | 07 | 04 | 01 | 02 | 13 | 10 | 15 | 16 | 1F | 1C | 19 | 1A |
Le déchiffrement s'effectue de la même manière qu'avec le chiffrement mais en utilisant un matrice M contenant des coefficients différents : 14, 11, 13 et 09. Le contenu de la matrice est présenté ci-dessous et il existe aussi des tableaux de multiplication pour ces coefficients.
Contrairement à l'opération de mélange des valeurs par colonne vue dans la section précédente, l'opération du OU exclusif est beaucoup moins complexe.
Celle-ci consiste à effectuer un OU exclusif entre le bloc de 128 bits et la clé de transformation Ki, également d'une longueur de 128 bits, pour la ronde de transformation en cours. Le résultat est remis dans le bloc de 128 bits.
Cette opération s'applique aussi avec la clé K0 du début du chiffrement d'un bloc de 1024 bits avant d'effectuer les rondes de transformation comme déjà mentionné à la section 2.3.
La famille d'algorithmes AES dont AES-256 fait partie inclut les algorithmes AES-128 et AES-192, qui utilisent des clés de 128 bits et 192 bits respectivement. En comparaison avec ceux-ci, AES-256 offre un meilleure sécurité en raison de la longueur de sa clé qui permet d'avoir 2256 valeurs possibles (de l'ordre de 1077).
En contrepartie, AES-256 est moins rapide que les autres variantes de la famille AES parce que ces derniers effectuent moins de rondes de transformation par bloc de 128 bits : 10 pour AES-128, 12 pour AES-192, comparativement à 14 pour AES-256.
Dans la pratique courante, les algorithmes AES-128 et AES-256 sont les plus utilisés sur Internet, et ce, à peu près à parts égales. Pour les contextes où la rapidité est privilégiée (ex. : applications mobiles), AES-128 est le choix qui s'impose. Les secteurs pour lesquels des données sensibles peuvent être utilisées (ex. : gouvernement, armée, finance) vont adopter de leur côté AES-256. L'utilisation de AES-192, de son côté, est relativement marginale.
Le tableau ci-dessous donne la liste des algorithmes de la famille AES et les différences entre eux.
Algorithme |
Long. clé (bits) |
Valeurs possibles (base 2) |
Approx. (base 10) |
Rondes transf. |
---|---|---|---|---|
AES-128 | 128 | 2128 | 1038 | 10 |
AES-192 | 192 | 2192 | 1057 | 12 |
AES-256 | 256 | 2256 | 1077 | 14 |
La clé symétrique à utiliser pour les algorithmes de la famille AES doit être connue à la fois de l'émetteur et du destinataire. Pour que les deux parties aient au départ la même valeur de cette clé, cela ne se fait pas par une décision de l'une de celles-ci qui transmet ensuite la valeur de la clé à l'autre, ce qui créerait un risque d'interception de la clé.
Heureusement, la plupart des protocoles modernes de communication (TLS, Signal, Wireguard, etc.) comportent un mécanisme permettant à chacune des deux parties de calculer séparément la valeur de la clé et d'arriver au même résultat sans jamais à faire transiter celui-ci.
Bien que les ordinateurs augmentent continuellement en puissance, ils seront toujours trop lents pour effectuer une attaque par force brute visant à déterminer la valeur d'une clé utilisée par les algorithmes de la famille AES. Ces algorithmes de chiffrement offrent actuellement un haut niveau de confiance pour la sécurisation des données.
L'émergence des ordinateurs quantiques actuellement en progression peut toutefois changer la donne. L'algorithme de Grover conçu pour ce type d'appareils permettrait de réduire de la racine carrée l'effort requis pour une attaque par force brute.
Pour l'algorithme AES-256, cela ramenerait à un nombre de l'ordre de 1038 possibilités à tester pour une attaque, un effort qui n'est toujours pas envisageable pour que l'attaque puisse être effectuée dans un délai réalisable, même pour un ordinateur quantique. Les perspectives d'avenir pour l'algorithme AES-256 restent bonnes car l'ordre de complexité requis par l'algorithme de Grover pour tenter de le fragiliser demeure exponentiel.
AES-128 est plus vulnérable face aux ordinateurs quantiques en raison de sa clé plus courte qui ferait en sorte qu'une attaque par force brute avec l'algorithme de Grover nécessiterait un effort de 264 (environ 1019) opérations, un chiffre qui devient plausible. Un passage à AES-256 permettrait à coût réduit d'écarter les risques d'une attaque par force brute.
La menace posée par les ordinateurs quantiques vise davantage les algorithmes à clé publique, comme RSA et Diffie-Hellman, qui viennent en support à ceux de la famille AES. Pour ce type d'algorithmes, l'effort requis avec un ordinateur quantique pour les déjouer serait réduit à un ordre non exponentiel en utilisant un algorithme dédié à cette tâche, l'algorithme de Shor. Cette possibilité constitue une menace plus sérieuse. L'algorithme de Shor est conçu spéfiquement pour les algorithmes à clé publique et ne peut pas s'appliquer aux algorithmes de la famille AES.
C'est surtout pour contrer l'algorithme de Shor que des efforts sont actuellement consacrés à une transition vers des algorithmes dits « post-quantiques », comme Kyber et Dilithium, en remplacement des algorithmes à clé publique existants. Le tableau ci-dessous montre un récapitulatif concernant le passage à l'éventuelle ère quantique des algorithmes actuels.
Type d'algorithme |
Menace quantique |
Effort quantique |
Solution post-quantique |
---|---|---|---|
À clé publique (RSA, Diffie-Hellman, etc.) |
Shor | Non exponentiel |
Algorithmes post-quantiques (Kyber, Dilithium, etc.) |
AES-128 | Grover | Exponentiel | Passer à AES-256 |
AES-256 | Grover | Exponentiel | Algorithme déjà prémuni |
Bien que pour le futur l'algorithme AES-256 paraît mieux blindé contre les ordinateurs quantiques que les autres algorithmes, des algorithmes plus performants que Grover pourraient voir le jour et compromettre sa sécurité. Dans cette optique, la recherche d'alternatives post-quantiques pour en prendre éventuellement la relève est de mise.
Par l'utilisation d'une clé de chiffrement initiale qui fait propager des valeurs différentes à un ensemble de clés de transformation, l'algorithme AES-256, tout comme les autres algorithmes de la famille AES, permet le chiffrement d'un texte secret et la transmission de celui-ci à un destinataire sans qu'un observateur indiscret durant la communication puisse déterminer le contenu du texte brut initial.
Le destinataire, qui connaît la valeur de la clé de chiffrement au même titre que l'émetteur, peut déchiffrer le texte secret en utilisant cette clé.
Le chiffrement et le déchiffrement du texte se font par blocs de 128 bits. Pour chaque bloc, une série de 10, 12 ou 14 rondes de transformation, selon l'algorithme AES utilisé, est effectuée en utilisant les clés de transformation générées à partir de la clé initiale de chiffrement.
Chaque ronde de transformation de bloc est constituée des opérations suivantes :
Tous les algorithmes de la famille AES peuvent être appliqués selon plusieurs modes comme ECB, CBC, CTR et GCM. Le mode GCM est actuellement la norme dans les échanges sur Internet car celui-ci permet d'authentifier l'identité de l'émetteur, ce qui n'est pas possible avec les autres modes.
Dworkin, M. (2001). Recommendation for Block Cipher Modes of Operation - Methods and Techniques. NIST - National Institute of Standards and Technology.
Wagner, L. (2020, 30 avril). Is AES-256 Quantum Resistant? The Quantum Insider.
Rijndael S-box.
Rijndael MixColumns.
Block cipher mode of operation.
Authenticated encryption.
Galois/Counter Mode.
Comme il a été mentionné précédemment à la section 2.1, la génération des clés de transformation K0 à K15, d'une longueur de 128 bits chacune, se fait par paires de clés et les deux premières clés K0 et K1 sont mises à jour avec les valeurs des deux moitiés de la clé initiale de chiffrement de 256 bits.
Chaque paire de clés propage ensuite des nouvelles valeurs à conserver dans la prochaine paire de clés par un procédé complexe dont les détails sont donnés dans cette annexe. Conceptuellement, chaque paire de clés commence par une clé de rang pair (ex. : K8) et finit forcément par une clé de rang impair (ex. : K9).
Pour la propagation des valeurs de clés, chaque clé (de 128 bits) dans une paire de clés est conceptuellement divisée en 4 « mots » de 32 bits. Le premier mot d'une clé de rang pair, et par le fait même d'une paire de clés, fait l'objet d'un traitement particulier alors que les autres mots dans la paire de clés sont soumis à un traitement plus régulier.
Prendre note que les détails présentés dans cette annexe ne s'appliquent qu'à l'algorithme AES-256. Le traitement pour les autres algorithmes AES-128 et AES-192 de la famille AES est similaire mais comporte tout de même certaines différences en raison des longueurs de clés et des nombres de rondes qui ne sont pas les mêmes.
Pour le cas particulier du premier mot de 32 bits d'une clé rang pair, les opérations suivantes sont effectuées à partir des deux clés Ki - 2 et Ki - 1 qui précèdent celle de rang pair Ki dont on veut mettre à jour le premier mot :
Les opérations ci-dessous sont effectuées pour chacun des mots après le premier mot pour la paire de clés Ki et Ki + 1, en utilisant la paire de clés Ki - 2 et Ki - 1 qui précèdent :
L'utilisation des corps finis constitue un élément fondamental dans le principe de fonctionnement de l'algorithme AES-256. En particulier, l'opération de « multiplication dans un corps fini », mentionné à certaines reprises dans l'article, s'avère très utile en raison de son potentiel pour produire des résultats de façon quasi-aléatoire.
Sans entrer dans le détail de la théorie des corps finis pour ne pas déborder du cadre de l'article, nous allons nous référer aux corps finis qui concernent directement l'algorithme AES-256 selon la notation employée dans la théorie : F256 et F2128. Bien qu'un corps fini soit souvent représenté par des polynômes, il peut aussi l'être par des nombres binaires lorsque celui-ci s'applique à une puissance de 2, ce qui est le cas pour AES-256.
Pour effectuer une opération dans un corps fini (multiplication, inverse multiplicatif), un polynôme dit « irréductible » doit être utilisé à cette fin. Celui-ci permet de s'assurer que le résultat de l'opération reste dans le corps fini.
Pour l'algorithme AES-256, le corps fini F256 est utilisé pour les opérations suivantes :
Comme il a été vu dans les sections correspondant à ces opérations, des tableaux peuvent être utilisés directement sans utiliser les corps finis mais le recours à ceux-ci demeure facultatif. Certaines organisations peuvent décider de plutôt effectuer dynamiquement à chaque fois les opérations s'appliquant au corps fini F256 permettant d'avoir l'équivalent de ce qui peut être obtenu à partir des tableaux.
Le polynôme irréductible utilisé pour les opérations dans le corps fini F256 pour l'algorithme AES-256 est le suivant (en binaire, les positions de bits à 1 correspondent aux puissances de x présentes dans le polynôme) :
x8 + x4 + x3 + x + 1 (binaire : 100011011; hexadécimal : 11B)
Un exemple détaillé de multiplication dans le corps fini F256 peut être consulté dans l'article Corps finis et chiffrement des données.
Pour l'algorithme AES-256, le corps fini F2128 est utilisé pour l'opération suivante :
Le polynôme irréductible utilisé pour une opération dans le corps fini F2128 pour l'algorithme AES-256 est le suivant :
x128 + x7 + x2 + x + 1 (hexadécimal : 1 00000000 00000000 00000000 00000087)
Le corps fini donne accès à 2128 valeurs possibles (de l'ordre de 1038 valeurs). Un tel chiffre exclut l'emploi de tableaux déjà définis à l'avance comme c'est le cas pour le corps F256 et impose de lui-même l'utilisation dynamique des opérations dans le corps fini F2128.
La construction du tableau S-box utilisé pour la substitution de caractères repose, du moins en partie, sur l'opération d'inverse multiplicatif dans le corps fini F256 de la valeur du caractère à substituer, comme mentionné à l'annexe précédente.
Le calcul de l'inverse multiplicatif dans un corps fini peut être fait de plusieurs manières pour un nombre donné du corps fini, notamment en l'élevant à la puissance 254 pour le corps fini F256. Cela peut être fait en seulement quelques étapes de multiplication du nombre par lui-même dans le corps fini en utilisant un polynôme irréductible. La méthode employée est décrite plus en détail dans l'article Corps finis et chiffrement des données
Pour la substitution de caractères, l'inverse multiplicatif doit être utilisé avec le même polynôme irréductible que celui mentionné à l'annexe précédente (x8 + x4 + x3 + x + 1 ou 100011011 [binaire] ou 11B [hexadécimal]). Plusieurs autres étapes, dites de « transformation affine », qui différent selon la partie où l'on applique l'algorithme AES-256 (chiffrement ou déchiffrement), sont aussi utilisées pour la substitution de caractères.
La liste complète des étapes lors du chiffrement est donnée ci-dessous (C : caractère à substituer; S : caractère de substitution; I : inverse multiplicatif).
Si on prend l'exemple de C = D4 (hexadécimal), on peut déterminer que son inverse multiplicatif est C5 (voir le tableau des inverses multiplicatifs à la fin de l'article). Sans détailler toutes les étapes ci-dessus, on obtiendra 48 comme résultat.
Pour avoir la valeur initiale C du caractère substitué à partir de celle du caractère de substitution S, les étapes ci-dessous, qui constituent l'inverse de la transformation montrée précédemment, doivent être effectuée lors du déchiffrement (T : variable de travail).
Si on reprend le résultat du chiffrement précédent avec S = 48 (hexadécimal), on a la valeur C5 comme dernier résultat intermédiaire en appliquant les étapes ci-dessus, sans les détailler, avant de déterminer l'inverse multiplicatif de T . Et l'inverse multiplicatif de C5 est bel et bien D4, le caractère initial avant chiffrement.
Le tableau ci-dessous montre les inverses multiplicatifs dans F256 avec le polynôme irréductible x8 + x4 + x3 + x + 1 (ou 100011011 [binaire] ou 11B [hexadécimal]) utilisé pour AES-256.
Ce tableau n'est utilisé ici que pour les fins de la présente démonstration et n'est pas implanté dans la pratique courante. Pour les installations qui utiliseraient l'inverse multiplicatif pour éviter d'utiliser le tableau S-box pour des raisons de sécurité, il n'y aurait aucun intérêt à employer un tableau des inverses multiplicatifs car celui-ci serait exposé aux mêmes risques que le tableau S-box. Pour de telles configurations, le calcul de l'inverse multiplicatif se fait dynamiquement.
Dans le tableau, les rangées correspondent aux 4 bits les plus significatifs du nombre dont on veut déterminer l'inverse multiplicatif et les colonnes correspondent à ses 4 bits les moins significatifs.
_0 | _1 | _2 | _3 | _4 | _5 | _6 | _7 | _8 | _9 | _A | _B | _C | _D | _E | _F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0_ | -- | 01 | 8D | F6 | CB | 52 | 7B | D1 | E8 | 4F | 29 | C0 | B0 | E1 | E5 | C7 |
1_ | 74 | B4 | AA | 4B | 99 | 2B | 60 | 5F | 58 | 3F | FD | CC | FF | 40 | EE | B2 |
2_ | 3A | 6E | 5A | F1 | 55 | 4D | A8 | C9 | C1 | 0A | 98 | 15 | 30 | 44 | A2 | C2 |
3_ | 2C | 45 | 92 | 6C | F3 | 39 | 66 | 42 | F2 | 35 | 20 | 6F | 77 | BB | 59 | 19 |
4_ | 1D | FE | 37 | 67 | 2D | 31 | F5 | 69 | A7 | 64 | AB | 13 | 54 | 25 | E9 | 09 |
5_ | ED | 5C | 05 | CA | 4C | 24 | 87 | BF | 18 | 3E | 22 | F0 | 51 | EC | 61 | 17 |
6_ | 16 | 5E | AF | D3 | 49 | A6 | 36 | 43 | F4 | 47 | 91 | DF | 33 | 93 | 21 | 3B |
7_ | 79 | B7 | 97 | 85 | 10 | B5 | BA | 3C | B6 | 70 | D0 | 06 | A1 | FA | 81 | 82 |
8_ | 83 | 7E | 7F | 80 | 96 | 73 | BE | 56 | 9B | 9E | 95 | D9 | F7 | 02 | B9 | A4 |
9_ | DE | 6A | 32 | 6D | D8 | 8A | 84 | 72 | 2A | 14 | 9F | 88 | F9 | DC | 89 | 9A |
A_ | FB | 7C | 2E | C3 | 8F | B8 | 65 | 48 | 26 | C8 | 12 | 4A | CE | E7 | D2 | 62 |
B_ | 0C | E0 | 1F | EF | 11 | 75 | 78 | 71 | A5 | 8E | 76 | 3D | BD | BC | 86 | 57 |
C_ | 0B | 28 | 2F | A3 | DA | D4 | E4 | 0F | A9 | 27 | 53 | 04 | 1B | FC | AC | E6 |
D_ | 7A | 07 | AE | 63 | C5 | DB | E2 | EA | 94 | 8B | C4 | D5 | 9D | F8 | 90 | 6B |
E_ | B1 | 0D | D6 | EB | C6 | 0E | CF | AD | 08 | 4E | D7 | E3 | 5D | 50 | 1E | B3 |
F_ | 5B | 23 | 38 | 34 | 68 | 46 | 03 | 8C | DD | 9C | 7D | A0 | CD | 1A | 41 | 1C |