Dans un premier temps, la clé est expansée en 16 clés par un algorithme appelé Key Schedule (KS).
Dans un second temps, le flux est crypté par bloc de huit octets en réalisant des opérations sur leurs bits avec la clé expansée.
Variable
/******/
TableCle : Tableau[16] De Nul Ou Tableau[8] De Nul Octet;
TableEntree : Tableau[64] De Nul Octet;
TableSortie : Tableau[64] De Nul Octet;
TableC : Tableau[28] De Nul Octet;
TableD : Tableau[28] De Nul Octet;
TableK : Tableau[48] De Nul Octet;
TableExpansion : Tableau[48] De Nul Octet;
TableP : Tableau[32] De Nul Octet;
TableS1 : Tableau[64] De Nul Octet;
TableS2 : Tableau[64] De Nul Octet;
TableS3 : Tableau[64] De Nul Octet;
TableS4 : Tableau[64] De Nul Octet;
TableS5 : Tableau[64] De Nul Octet;
TableS6 : Tableau[64] De Nul Octet;
TableS7 : Tableau[64] De Nul Octet;
TableS8 : Tableau[64] De Nul Octet;
TableEntree=
{
TableSortie=
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9,1,
59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7
};
{
TableC=
40,8,48,16,56,24,64,32,
39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30,
37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60,28,
35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58,26,
33,1,41,9,49,17,57,25
};
{
TableD=
57,49,41,33,25,17,9,
1,58,50,42,34,26,18,
10,2,59,51,43,35,27,
19,11,3,60,52,44,36
};
{
TableK=
63,55,47,39,31,23,15,
7,62,54,46,38,30,22,
14,6,61,53,45,37,29,
21,13,5,28,20,12,4
};
{
TableExpansion=
14,17,11,24,1,5,
3,28,15,6,21,10,
23,19,12,4,26,8,
16,7,27,20,13,2,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32
};
{
TableP=
32,1,2,3,4,5,
4,5,6,7,8,9,
8,9,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32,1
};
{
TableS1=
16,7,20,21,
29,12,28,17,
1,15,23,26,
5,18,31,10,
2,8,24,14,
32,27,3,9,
19,13,30,6,
22,11,4,25
};
{
TableS2=
14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,
0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,
4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,
15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13
};
{
TableS3=
15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,
3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,
0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,
13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9
};
{
TableS4=
10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,
13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,
13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,
1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12
};
{
TableS5=
7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,
13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,
10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,
3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14
};
{
TableS6=
2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,
14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,
4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,
11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3
};
{
TableS7=
12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,
10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,
9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,
4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13
};
{
TableS8=
4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,
13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,
1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,
6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12
};
{
13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,
1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,
7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,
2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11
};
Les tables TableEntree, TableSortie, TableC, TableD, TableK, TableP permettent de constituer un entier non signé S de N bits où N est la taille de la table.
La table est appliquée à une valeur d'entrée E, S=T() Sur E
, telque la valeur de chaque bit de S est donnée par la valeur d'un bit de E, bit dont le numéro est donné par l'index dans la table T.
Ainsi, les bits étant numérotés de 1 à N, le Iem bit de S est donné par la relation S(I)=T(I)-1 Sur E
.
Dans la suite de cette fiche, cet algorithme est appelé AppliquerTableDes.
Variable
/******/
I : Entier;
C : Tableau[4] De Nul Octet;
D : Tableau[4] De Nul Octet;
C=AppliquerTableDes(TableC,CleInitiale);
D=AppliquerTableDes(TableD,CleInitiale);
Pour I=1 JusquA 16 Faire
Si I Dans (1,2,9,16) Alors
Fin Pour
C=(C<<2)|((C&0x0C0000)>>26);
Sinon
D=(D<<2)|((D&0x0C0000)>>26);
C=(C<<1)|((C&0x080000)>>27);
TableCle[I-1]=AppliquerTableDes(TableK,Binaire(C)+Binaire(D));
D=(D<<1)|((D&0x080000)>>27);
/****************************************************************/
Fonction CalculerPositionDes(S : Octet , TableValeursS : Tableau[?] De Nul Ou Octet)
/* Objet : Calcule la position dans la table des permutations de S.*/
/*******************************************************************/
Variable
/******/
Index : Entier;
Debut
Si S&0x20 Alors
Index=32;
Else
Index=0;
Fin Si
Si S&0x01 Alors
Index+=16;
Fin Si
Index+=(S&0x1E)>>1;
Retourner TableValeursS[Index];
Fin Fonction
/****************************************************************/
Procedure Crypter(BufferEntree : Binaire, BufferSortie : Binaire Sortie)
/* Objet : Crypte un binaire de 8 octets. */
/****************************************************************/
Variable
/******/
I : Entier;
IP : Tableau[8] De Nul Octet;
IP2 : Tableau[4] De Nul Octet;
IP3 : Tableau[8] De Nul Octet;
L : Tableau[4] De Nul Octet;
L2 : Tableau[6] De Nul Octet;
R : Tableau[4] De Nul Octet;
S1 : Octet;
S2 : Octet;
S3 : Octet;
S4 : Octet;
S5 : Octet;
S6 : Octet;
S7 : Octet;
S8 : Octet;
Debut
/* Permutation du buffer d'entree. */
IP=AppliquerTableDes(TableEntree,BufferEntree);
/* Application des 16 cles. */
Pour I=1 JusquA 16 Faire
/* Decoupage de LI de 64 bits sur en deux registres L et R de 32 bits. */
Fin Pour
L=IP.Gauche(4);
R=IP.Droite(4);
/* Expansion de L de 32 bits en L2 de 48 bits. */
L2=AppliquerTableDes(TableExpansion,Binaire(L))+TableCles[I-1];
/* Extraction des huits registres de 6 bits S1 à S8. */
S1=(L2[0]&0x8C)>>25;
S2=((L2[0]&0x03)<<4)|((L2[1]&0xF0)>>4);
S3=(L2[1]&0x0F)|((L2[2]&0xC0)>>6);
S4=L2[2]&0x3F;
S5=(L2[3]&0x8C)>>25;
S6=((L2[3]&0x03)<<4)|((L2[4]&0xF0)>>4);
S7=(L2[4]&0x0F)|((L2[5]&0xC0)>>6);
S8=L2[5]&0x3F;
/* Calcul de S(L,K(i)). */
IP2[0]=(CalculerPositionDes(S1,TableS1)<<4)|CalculerPositionDes(S2,TableS2);
IP2[1]=(CalculerPositionDes(S3,TableS3)<<4)|CalculerPositionDes(S4,TableS4);
IP2[2]=(CalculerPositionDes(S5,TableS5)<<4)|CalculerPositionDes(S6,TableS6));
IP2[3]=(CalculerPositionDes(S7,TableS7)<<4)|CalculerPositionDes(S8,TableS8));
/* Applique P a S(L,K(i)). */
IP3=AppliquerTableDes(TableP,Binaire(IP2));
/* R=L et L=R+F(L,K(i)). */
IP[0]=R[0]+Ip3[0];
IP[1]=R[1]+Ip3[1];
IP[2]=R[2]+Ip3[2];
IP[3]=R[3]+Ip3[3];
IP[4]=L[0];
IP[5]=L[1];
IP[6]=L[2];
IP[7]=L[3];
/* Permutation du buffer de sortie. */
BufferSortie=AppliquerTableDes(TableSortie,IP);
Fin Procedure
/****************************************************************/
Procedure Decrypter(BufferEntree : Binaire, BufferSortie : Binaire Sortie)
/* Objet : Decrypte un binaire de 8 octets. */
/****************************************************************/
Variable
/******/
I : Entier;
IP : Tableau[8] De Nul Octet;
IP2 : Tableau[4] De Nul Octet;
IP3 : Tableau[8] De Nul Octet;
L : Tableau[4] De Nul Octet;
L2 : Tableau[6] De Nul Octet;
R : Tableau[4] De Nul Octet;
S1 : Octet;
S2 : Octet;
S3 : Octet;
S4 : Octet;
S5 : Octet;
S6 : Octet;
S7 : Octet;
S8 : Octet;
Debut
/* Permutation du buffer d'entree. */
IP=AppliquerTableDes(TableEntree,BufferEntree);
/* Application des 16 cles en ordre inverse. */
Pour I=16 JusquA 1 Faire
/* Decoupage de LI de 64 bits sur en deux registres L et R de 32 bits. */
Fin Pour
L=IP.Gauche(4);
R=IP.Droite(4);
/* Expansion de L de 32 bits en L2 de 48 bits. */
L2=AppliquerTableDes(TableExpansion,Binaire(L))+TableCles[I-1];
/* Extraction des huits registres de 6 bits S1 à S8. */
S1=(L2[0]&0x8C)>>25;
S2=((L2[0]&0x03)<<4)|((L2[1]&0xF0)>>4);
S3=(L2[1]&0x0F)|((L2[2]&0xC0)>>6);
S4=L2[2]&0x3F;
S5=(L2[3]&0x8C)>>25;
S6=((L2[3]&0x03)<<4)|((L2[4]&0xF0)>>4);
S7=(L2[4]&0x0F)|((L2[5]&0xC0)>>6);
S8=L2[5]&0x3F;
/* Calcul de S(L,K(i)). */
IP2[0]=(CalculerPositionDes(S1,TableS1)<<4)|CalculerPositionDes(S2,TableS2);
IP2[1]=(CalculerPositionDes(S3,TableS3)<<4)|CalculerPositionDes(S4,TableS4);
IP2[2]=(CalculerPositionDes(S5,TableS5)<<4)|CalculerPositionDes(S6,TableS6));
IP2[3]=(CalculerPositionDes(S7,TableS7)<<4)|CalculerPositionDes(S8,TableS8));
/* Applique P a S(L,K(i)). */
IP3=AppliquerTableDes(TableP,Binaire(IP2));
/* R=L et L=R+F(L,K(i)). */
IP[0]=R[0]+Ip3[0];
IP[1]=R[1]+Ip3[1];
IP[2]=R[2]+Ip3[2];
IP[3]=R[3]+Ip3[3];
IP[4]=L[0];
IP[5]=L[1];
IP[6]=L[2];
IP[7]=L[3];
/* Permutation du buffer de sortie. */
BufferSortie=AppliquerTableDes(TableSortie,IP);
Fin Procedure