Les clés de l'AES font 128,192 ou 256 bits. Chacune correspondant à un nombre de répétition du chiffrement.
Or pour éviter certaines attaques issues de la cryptanalyse, ces clés sont étendues.
Cela veut simplement signifier que d'autres clés sont créées à partir de la clé initiale.
Ainsi le Key schedule va permettre de créer une clé différente par tour de chiffrement, chacune de ces clés sous-clé faisant 128 bits.
On peut donc se demander deux choses :
Les clés de 128 bits sont plus faibles que celles de 192, qui sont elles-même plus faibles que celle de 256 bits.
Cela est justement dû au Key schedule, il permet de contrer certaines attaques, et sa construction implique qu'une clé de plus grande taille est plus sûre.
Ensuite, une seule grande clé serait aussi dangereux.
Tout d'abord à retenir. Il y aurait le risque que les gens choississent une clé facile à retenir, et donc plus facile à trouver.
Et finalement L'utilisation d'une seule grande clé est en fait ce que fait l'AES via le Key Schedule.
Cela permet d'avoir une clé complexe lors du chiffrement, mais suffisamment courte initialement pour être retenue.
Nous allons nous concentrer ici sur le Key Schedule des clés de 128 bits. Il n'y a qu'une légère altération pour les clés de plus grandes tailles.
Les clés faisant 128 bits, cela correspond à 16 octets. Par la suite, ils seront compactés par groupe de 4, tel que :
Dans le cas d'une clé de 128 bits, il y a 10 répétitions de l'algorithme. Il faut donc générer 10 clés supplémentaires (une clé étant utilisée avant le début des répétitions).
Le Key schedule se répète à chaque nouvelle clé. Ainsi la iéme clé est calculée à partir de la clé i+1.
on a :
L'opération d'extension de la clé consiste donc à produire 128 bits. On a ainsi le format suivant :
Le système ici est assez simple et se répétera à chaque itération de Key Schedule. (Pour la répétition suivante, W4 devient W0 et ainsi de de suite).
La somme se fait selon le schéma habituel, il s'agit d'une opération XOR (bit à bit) sur les deux blocs de 128 bits (somme dans GF(2)).
Le point important ici est la fonction g(). Elle s'applique donc sur un bloc de 4 octets et se décompose en 3 étapes
ici
représente les 3 étapes de la fonction g() :
Comme nous sommes toujours dans GF(28), les puissances de ce polynôme sont restreintes par le polynôme caractéristique de l'AES, P (voir section Maths).
Ainsi on a :
Pour résumer on a donc les 128 bits qui sont réunis par groupe de 4 octets, le premier est sommé avec le troisième, modifié par g().
Tout les autres sont ensuite sommés avec l'élément précédent et l'élément équivalent dans la clé précédente.
Cela donne le schéma suivant :
le schéma pour la création des sous-clés de 192 bits est presque similaire :
Il y a cependant un élément à prendre en compte, il y a besoin d'aller jusqu'a
.
Or, on créé a chaque fois 6 nouveaux éléments
.
On arrive donc à
, il ne faut donc que 4 élements supplémentaires
.
Pour la fonction g(), il s'agit toujours du dernier élement de la ligne précédente (le 6ème parmis 6).
(Il serait possible de créer encore 6 éléments, mais 2 ne seraient jamais utilisés.)
le schéma pour la création des sous-clés de 256 bits est presque similaire :
De même que pour les clés de 192 bits, lors de la dernière itération il n'est nécessaire de créer que 4 éléments
.
On peut voir un ajout ici, il s'agit de la deuxième étape de la fonction g(), l'opération SubByte.
L'AES étant symétrique, la même clé est utilisée pour le déchiffrement. Les mêmes Round Key (clé par itération) sont donc utilisées.
La différence va résider dans la création des clés, en effet, il y a deux manières de faire :
Or, dans le cas du déchiffrement, on commence par utiliser la clé de la derniére itération.
En effet, on déchiffre dans l'ordre des couches, or la dernière itération utilisant la dernière clé, on est obligé de créer toutes les clés avant de pouvoir déchiffrer.