Rc6

Algorithme utilisé par Up ! Security Manager

L'algorithme Arc Six (RC6) du laboratoire Rsa 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+4 octets.

Dans un second temps, le flux est crypté par bloc de seize 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+4;
S=TableauDe(0,T-1,Octet(0));
LL=(TailleCle+7)/8);
Pour I=0 JusquA TailleCle-1 Faire
Fin Pour
S[0]=RC6_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 RC6 d'un bloc de seize 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);
C=BufferEntree[8]+(BufferEntree[9]<<8)+(BufferEntree[10]<<16)+(BufferEntree[11]<<24);
D=BufferEntree[12]+(BufferEntree[13]<<8)+(BufferEntree[14]<<16)+(BufferEntree[15]<<24);
B+=S[0];
D+=S[1];
Pour I=1 JusquA NbIterations Faire
Fin Pour
A+=S[2*NbIterations+2];
C+=S[2*NbIterations+3];
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;
BufferSortie[8]=C&0xFF;
BufferSortie[9]=(C>>8)&0xFF;
BufferSortie[10]=(C>>16)&0xFF;
BufferSortie[11]=(C>>24)&0xFF;
BufferSortie[12]=D&0xFF;
BufferSortie[13]=(D>>8)&0xFF;
BufferSortie[14]=(D>>16)&0xFF;
BufferSortie[15]=(D>>24)&0xFF;
Fin Procedure

Decryptage RC6 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);
C=BufferEntree[8]+(BufferEntree[9]<<8)+(BufferEntree[10]<<16)+(BufferEntree[11]<<24);
D=BufferEntree[12]+(BufferEntree[13]<<8)+(BufferEntree[14]<<16)+(BufferEntree[15]<<24);
C=C-CleExpansee[2*NbIterations+3]);
A=A-CleExpansee[2*NbIterations+2]);
Pour I=NbIterations JusquA 1 Pas -1 Faire
Fin Pour
D-=D[1];
B-=B[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;
BufferSortie[8]=C&0xFF;
BufferSortie[9]=(C>>8)&0xFF;
BufferSortie[10]=(C>>16)&0xFF;
BufferSortie[11]=(C>>24)&0xFF;
BufferSortie[12]=D&0xFF;
BufferSortie[13]=(D>>8)&0xFF;
BufferSortie[14]=(D>>16)&0xFF;
BufferSortie[15]=(D>>24)&0xFF;
Fin Procedure