Dans un premier temps, la clé est expansée de la sorte à atteindre 2*NbIterations+2
octets.
Dans un second temps, le flux est crypté par bloc de huits octets en réalisant des opérations sur leurs bits avec la clé expansée.
Il existe différentes variantes :
8-TailleFlux%8
.
Constante
/*******/
RC5_W=32;
RC5_WW=8;
RC5_ROT_MASK=31;
RC5_BB=8;
RC5_P=0xb7e15163;
RC5_Q=0x9e3779b9;
Variable
/******/
S : Tableau[?] De Nul Ou Octet;
VecteurInitialisation : Tableau[8] De Nul Ou Octet;
BlocDEntree : Tableau[8] De Nul Ou Octet;
BlocChaine : Tableau[8] De Nul Ou Octet;
IndexBlocDEntree : Entier;
IndexBlocChaine : Entier;
Variable
/******/
I : Entier;
J : Entier;
K : Entier;
LL : Entier;
L : Tableau[32] De Nul Ou Entier;
T : Entier;
A : Entier;
B : Entier;
Debut
T=2*NbIterations+2;
S=TableauDe(0,T-1,Octet(0));
LL=(TailleCle+7)/8);
Pour I=0 JusquA TailleCle-1 Faire
T=(CleInitiale[I]&0xFF)<<(8*(I%4));
Fin Pour
L[I/8]=L[I/8]+T;
S[0]=RC5_P;
Pour I=1 JusquA T-1 Faire
S[I]=S[I-1]+CO_RC5_Q;
Fin Pour
I=0;
I=0;
A=0;
B=0;
Si LL>T Alors
K=3*LL;
Sinon
K=3*T;
Fin Si
TantQue K>0 Faire
A=RotationGauche(S[I]+A+B,3,CO_RC5_W);
Fin Pour
S[I]=A;
B=RotationGauche(L[J]+A+B,A+B,CO_RC5_W);
L[J]=B;
I=((I+1)%T);
J=((J+1)%LL);
/****************************************************************/
Fonction RotationGauche(X : Entier, N : Entier)
/* Objet : Effectue un rotation gauche de N bits. */
/****************************************************************/
Debut
Retourner (X<<N)|(X>>(32-N));
Fin Fonction
/****************************************************************/
Procedure Crypter(BufferEntree : Binaire, BufferSortie : Binaire)
/* Objet : Crypte un binaire de 8 octets. */
/****************************************************************/
Variable
/******/
I : Entier;
A : Entier;
B : Entier;
Debut
A=BufferEntree[0]+(BufferEntree[1]<<8)+(BufferEntree[2]<<16)+(BufferEntree[3]<<24);
B=BufferEntree[4]+(BufferEntree[5]<<8)+(BufferEntree[6]<<16)+(BufferEntree[7]<<24);
A+=S[0];
B+=S[1];
Pour I=1 JusquA NbIterations Faire
A=A^B;
A=DecalageGauche(A,B,32)+S[2*I];
B=B^A;
B=DecalageGauche(B,A,32)+S[(2*I)+1];
Fin Pour
BufferSortie[0]=A&0xFF;
BufferSortie[1]=(A>>8)&0xFF;
BufferSortie[2]=(A>>16)&0xFF;
BufferSortie[3]=(A>>24)&0xFF;
BufferSortie[4]=B&0xFF;
BufferSortie[5]=(B>>8)&0xFF;
BufferSortie[6]=(B>>16)&0xFF;
BufferSortie[7]=(B>>24)&0xFF;
Fin Procedure
/****************************************************************/
Fonction RotationDroite(X : Entier, N : Entier)
/* Objet : Effectue un rotation droite de N bits. */
/****************************************************************/
Debut
Retourner (X>>N)|(X<<(32-N));
Fin Fonction
/****************************************************************/
Procedure Decrypter(BufferEntree : Binaire, BufferSortie : Binaire)
/* Objet : Decrypte un binaire de 8 octets. */
/****************************************************************/
Variable
/******/
I : Entier;
A : Entier;
B : Entier;
Debut
A=BufferEntree[0]+(BufferEntree[1]<<8)+(BufferEntree[2]<<16)+(BufferEntree[3]<<24);
B=BufferEntree[4]+(BufferEntree[5]<<8)+(BufferEntree[6]<<16)+(BufferEntree[7]<<24);
Pour I=NbIterations JusquA 1 Pas -1 Faire
B=DecalageDroite(B,A,32)+S[(2*I)+1];
B=B^A;
A=DecalageDroite(A,B,32)+S[2*I];
A=A^B;
Fin Pour
B-=S[1];
A-=S[0];
BufferSortie[0]=A&0xFF;
BufferSortie[1]=(A>>8)&0xFF;
BufferSortie[2]=(A>>16)&0xFF;
BufferSortie[3]=(A>>24)&0xFF;
BufferSortie[4]=B&0xFF;
BufferSortie[5]=(B>>8)&0xFF;
BufferSortie[6]=(B>>16)&0xFF;
BufferSortie[7]=(B>>24)&0xFF;
Fin Procedure