II. Principe de la Méthode de Feistel
La solution apportée par Feistel est très ingénieuse : on suppose par exemple
qu'on a une fonction f "presque aléatoire" qui prend comme argument un mot de n
bits, et renvoie un mot de n bits (qui donne l'impression d'avoir été choisi au
hasard). L'algorithme de chiffrement va procéder en chiffrant des blocs de 2n bits,
qu'on partage en 2, partie gauche G, partie droite D. L'image du bloc (G,D) par le
schéma de Feistel est le bloc (L,R), avec L=D, et R= G xor f(D). Cette transformation
est cette fois bijective, car si on a un tel couple (L,R), on retrouve (G,D) par D=L et
G=R xor f(L). Bien sûr, la partie droite n'a pas été transformée (juste envoyée à
gauche). C'est pourquoi on répète le schéma de Feistel un certain nombre de fois (on
parle de tours - le DES par exemple en comporte 16).
1. Le XOR (« non ou » littéralement)
La procédure qui suit, codée en Maple, permet de réaliser un XOR sur 2 listes b1 et
b2 :
Xor := proc(b1,b2)
local n,i,c;
n:=nops(b1);
for i from 1 to n do
c[i] := b1[i]+b2[i] mod 2;
od;
convert(c,list);
end proc;
On veut construire ici une bijection qui transforme quatre bits en quatre autres bits.
La bijection est contitué de deux fonctions que l'on appelle sbox1 et sbox2 qui à
deux bits donnés font correspondre deux autres bits. La Sbox est en fait un
algorithme de substitution.
Les procédures qui suivent, codée en Maple, sont deux exemples de sbox :
Sbox1 := proc(b) local c;
if b[1]=0 and b[2]=0 then c:=[0,1]; fi:
if b[1]=0 and b[2]=1 then c:=[1,1]; fi:
if b[1]=1 and b[2]=0 then c:=[1,0]; fi:
if b[1]=1 and b[2]=1 then c:=[0,1]; fi:
convert(c,list);
end proc:
Sbox2 := proc(b) local c;
if b[1]=0 and b[2]=0 then c:=[0,1]; fi:
if b[1]=0 and b[2]=1 then c:=[0,0]; fi:
if b[1]=1 and b[2]=0 then c:=[0,0]; fi:
if b[1]=1 and b[2]=1 then c:=[0,1]; fi:
convert(c,list);
end proc: