Principe de "Key Schedule"

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 :

  • Pourquoi n'utilise t-on pas alors que des clés de 128 bits ? (Pourquoi en utiliser 256 si c'est pour retomber à 128 ?)
  • Pourquoi n'utilise t'on pas une clé qui serait de la taille du bloc de donnée multipliée par le nombre de tours ?

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.

Algorithme de Key Schedule

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 : Soit Kb0b1b126b127Avec bi0;1V0V1V14V15Avec Vi=b8i b8i+1 b8i+2 b8i+3 b8i+4 b8i+5 b8i+6 b8i+7 W0W1W2W3Avec Wi={V4i V4i+1 V4i+2 V4i+3}
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 : keySchedule(Ki)=Ki+1

L'opération d'extension de la clé consiste donc à produire 128 bits. On a ainsi le format suivant :
W4=W0+g(W3)Avec g() fonction non linéaireW5=W4+W1W6=W5+W2W7=W6+W3

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 g1,g2,g3 représente les 3 étapes de la fonction g() :

  1. un décalage (similaire à un ShiftColumn) de 3 :
    g1(W3)=g1(V12V13V14V15)=V13V14V15V12

  2. On applique ensuite à chaque octet la transformation SubByte :
    g2(V13V14V15V12)=S(V13)S(V14)S(V15)S(V12)=V13'V14'V15'V12'

  3. On somme sur le premier octet un coefficient (puissance de 2 dans GF(28) qui va dépendre de l'indice j de la répétition.
    g3(V13'V14'V15'V12')=V13'+Rj-1 V14' V15' V12'Avec R=0*X7+0*X6+0*X5+0*X4+0*X3+0*X2+1*X1+0*X0

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 :

indice de la répétitionj=1; R0 mod P=(00000001)2j=2; R1 mod P=(00000010)2j=3; R2 mod P=(00000100)2j=4; R9 mod P=(00110110)2


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 : algorithm


Clés de 192 bits

le schéma pour la création des sous-clés de 192 bits est presque similaire :
algorithm
Il y a cependant un élément à prendre en compte, il y a besoin d'aller jusqu'a W51. Or, on créé a chaque fois 6 nouveaux éléments (W5W11).
On arrive donc à W47, il ne faut donc que 4 élements supplémentaires (W48W51).
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.)

Clés de 256 bits

le schéma pour la création des sous-clés de 256 bits est presque similaire :
algorithm
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 (W56W59).
On peut voir un ajout ici, il s'agit de la deuxième étape de la fonction g(), l'opération SubByte.

Réversibilité

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 :

  • Toutes les créer avant le chiffrement, ce qui peut prendre du temps (selon la taille de la clé)
  • Les créer au fur et à mesure des itérations

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.