Principe de l'AES

L'AES est un algorithme de chiffrement symétrique. La même clé est utilisée pour chiffrer et déchiffrer un texte.
Il repose entièrement sur des notions mathématiques liées aux ensembles (les corps notamment) et a l'arithmétique modulaire.
Ici nous allons expliciter le déroulement global de l'algorithme, ainsi que les bases mathématiques nécessaires.
Vous pourrez ensuite parcourir les sections pour comprendre le fonctionnement de chaque composant de l'algorithme.

L'AES travaille avec des blocs de données de taille fixe. Chaque bloc est un tableau de 4*4 octets. Chacune de ses cellules (de un octet) est appelé un mot.
L'AES travaille donc avec des blocs de 128 bits. Pour coder de plus gros volumes de données, un découpage préalable de la donnée en bloc est réalisé,
avant que chaque bloc soit encodé séparément.

AES : principe de l'algorithme

L'AES chiffre un bloc d'entrée en un bloc de sortie. Le bloc de donnée se présente sous la forme suivante :
A=A1A2A3A4A5A6A7A8A9A10A11A12A13A14A15A16
Chacun des éléments du bloc A est un octet, et il y en a 16 pour un bloc, soit 128 bits au total.

L'input (données entrées dans l'algorithme) est ce que l'on appelle le Plain Text, le texte non chiffré.
L'output (données en sortie de l'algorithme) est ce que l'on appelle le Cypher Text, le texte chiffré.

Pour chiffrer, il applique sur le Plain Text 4 fonctions distinctes dans un ordre précis et de façon répétitive, chacunes étant réversibles.
La clé de chiffrement est utilisée pour chiffrer mais aussi pour déterminer le nombre de répétition.
Les clés peuvent faire 128, 192 ou 256 bit, correspondant respectivement à 10, 12 et 14 répétitions.
Avant chaque répétition, on créera ce que l'on appelle la RoundKey, qui est une clé dérivée de la clé initiale.

Le schéma général de l'AES est le suivant :
algorithm
Chaque fonction sera explicitée dans sa section propre.

IMPORTANT : Héxadécimal et binaire

Dans les prochaines pages, vous verrez que les octets dans le bloc de donnée sont représentés en hexadécimal.
Cela ne correspond PAS à l'ensemble des entiers ! Il serait faux de convertir en base 10.
Un élement du bloc de donnée (octet) peut être converti en un polynôme appartenant a GF(28).
Le passage à l'héxadécimal permet uniquement de contracter l'écriture(passer de 8 à 2 caractères).
L'héxadécimal est une écriture en base 16, ainsi l'élément le plus à droite est multiplié par 160.
Le second par 16, ensuite par 162 et ainsi de suite.

Pour passer du binaire à l'héxadécimal :
On sépare l'octet entre ses 4 bits de poids faible (4 plus à droite) et ses 4 bits de poids forts (4 plus à gauche).
On somme ensuite, comme si il s'agissait de deux chiffres représentés en binaire.
Tout peux se faire selon le schéma suivant :
b7 b6 b5 b4h1b3 b2 b1 b0 h2
Avec :
h1=b7·23+b6·22+b5·21+b4·20h2=b3·23+b2·22+b1·21+b0·20

Par construction, un chiffre en héxadécimal peut prendre les valeurs suivantes :
{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F} avec A, B, ..., F correspondant à 10, 11, ...,15.

ex :
Un élément du bloc de donnée contient "10011011" (équivalent au polynôme X7 + X4 + X4 + X1 + X0)
Pour simplifier l'écriture, on passe à l'héxacédimal :
10011011 est séparé en 1001 et 1011.
Grâce à la formule précédente, on a :

  • h1 = 8+0+0+1 = 9
  • h2 = 8+0+2+1 = 11


Or en héxadécimal, 11 correspond à B.
De plus, dans de nombreux langages informatique, on ajoute un préfixe (par exemple 0x en Javascript) pour le différencier de la base 10.
On a donc au final : 100110112=0x9B