Rc5

Algorithme utilisé par Up ! Security Manager

L'algorithme Arc Five (RC5) de l'Internet Engineering Task Force (IETF) crypte un flux binaire à partir d'une clé CleInitiale de taille TailleCle qui est au plus 256 octets et d'un nombre d'itérations compris entre 1 et 255.

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 :

Contexte

L'algorithme de cryptage / décryptage utilise un contexte composé des constantes et des variables globales suivantes :

Constante
/*******/


Variable
/******/

Expansion de la clé

Voici l'algorithme d'expansion de la clé :

Variable
/******/


Debut
T=2*NbIterations+2;
S=TableauDe(0,T-1,Octet(0));
LL=(TailleCle+7)/8);
Pour I=0 JusquA TailleCle-1 Faire
Fin Pour
S[0]=RC5_P;
Pour I=1 JusquA T-1 Faire
Fin Pour
I=0;
I=0;
A=0;
B=0;
Si LL>T Alors Sinon Fin Si
TantQue K>0 Faire Fin Pour

Cryptage RC5 d'un bloc de huit octets

/****************************************************************/
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
/******/

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
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

Decryptage RC5 d'un bloc de huit octets

/****************************************************************/
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
/******/

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
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