Principe de ByteSub

ByteSub est une application avec les propriétés suivantes :

  • Bijective :
    yF,!xE;fx=y
  • Non linéaire :
    ByteSub(A)+ByteSub(B)ByteSub(A+B)

Dans notre cas, les ensembles E et F sont les mêmes. il s'agit de GF(28).
La bijectivité permet de s'assurer que lors du chiffrement tout les éléments aient une image différente.
Ainsi lors du déchiffrement, il n'y aura pas d'incohérence, une fonction bijective étant inversible, tel que son inverse est aussi une fonction bijective.
xE,!yF;f-1y=x

La non linéarité permet de se protéger de certaines attaques (voir sources).

Fonctionnement de ByteSub

Le but de ByteSub est d'effectuer une substitution octet (byte) par octet. Cela s'effectue en deux étapes distinctes.
Dans cette partie, on va reprendre A = 100110112=0x9B , dans le but de créer un exemple.

ByteSub : passage à l'inverse

Tout d'abord on remplace la valeur A=(a7 a6 a5 a4 a3 a2 a1 a0) (un mot du bloc de donnée) par son inverse dans GF(28).
Étant donné que nous sommes dans un corps, il faut préciser quelle opération nous utilisons.
Dans ce cas, il s'agit de l'inverse dans le groupe multiplicatif, d'élément neutre 0x01.
Dans ce groupe, 0x00 n'ayant pas d'inverse, il est son propre inverse par convention.
Cela peut se faire via une table :
algorithm
(Pour passer du binaire a l'héxadécimal, voir l'onglet sur l'algorithme AES).
Celle-ci peut directement être codée "en dur" dans un programme, elle ne varie jamais.
On a donc :
A=(a7 a6 a5 a4 a3 a2 a1 a0) B'=(b'7b'6b'5b'4b'3b'2b'1b'0)=A-1

Exemple :
Si l'on reprend l'inverse de A, on a donc :
A-1 = B'=100010002=0x88

ByteSub : fonction non linéaire

Dans cette seconde étape, on modifie la valeur en la multipiant par un vecteur puis en sommant un terme constant, le tout modulo 2.
Le fait que cette fonction soit bijective permettra plus tard le déchiffrement de cette étape.

Ainsi :
Soit B=f(B');
Avec la fonction f() correspondant à :
b0b1b2b3 b4b5b6b7 100011 11110001 1111100011 111100011 111100001 111100001 111100001 1111×b'0 b'1b'2b'3b'4 b'5b'6b'7+ 11000 110  mod 2

Exemple :
On reprend B'=100010002=0x88
Après calcul, on va trouver f(B')=B=000101002=0x14

ByteSub : simplification

Il est possible de simplifier cette étape. En effet, cette transformation f() est une bijection.
Chaque élément de GF(28) possède une image unique et un antécédent unique. De plus, l'inverse d'un élément est unique.
En effet :
Soit a,b,c,eGF(28);b,c inverse de aet e élément neutreAlorsa*b=a*c=eAinsi(b*a)*b=(b*a)*ccar * associativeAinsie*b=e*ccar b inverse de aDoncb=ccar e neutre
L'inverse est donc unique pour chaque élément, pour l'opération *.

Chaque élément de GF(28) a donc un inverse unique et une image unique par f().
L'ensemble GF est finis, il est donc possible de calculer ByteSub pour chacun de ses éléments.
Cela donne la table suivante (ici en notation hexadécimale) :

algorithm
On peut voir qu'il n'y a aucune symétrie ou de point spécifique.

Exemple :
SI l'on reprend A = 100110112=0x9B
On peut directement faire la correspondance (inverse et passage par f()).
Cela donne bien B=000101002=0x14

Inversibilité de f()

ByteSub étant bijective, il est possible de construire sa fonction inverse.
pour la fonction f(), elle représente un système de 8 inconnues à 8 équations, il est donc possible de le résoudre.
Cela permet d'obtenir la fonction suivante :

b'0b'1b'2b'3b'4b'5b'6b'70101001000101001100101000100101000100101100100100100100110100100×b0b1b2b3b4b5b6b7+00000101 mod 2

Inversibilité de l'inverse

De plus, comme on peut le voir dans la table des inverses, si a inverse de b alors b inverse de a.
On peut donc réutiliser cette table:
algorithm
Ainsi, il est possible de remonter ByteSub. Tout d'abord en trouvant la fonction inverse f-1().
Ensuite, de reprendre l'inverse du résultat, pour retomber sur l'élement initial.

Simplification du déchiffrement de ByteSub

De même que pour ByteSub, il est possible de précalculer le résultat pour chaque élément :

algorithm

Si vous voulez, vous pouvez vérifier :

  • qu'aucun élément n'est sa propre image
  • qu'aucun élément n'est symétrique
  • que la fonction est bien bijective