Rc2

Algorithme utilisé par Up ! Security Manager

L'algorithme Arc Two (RC2) de l'Internet Engineering Task Force (IETF) crypte un flux binaire à partir d'une clé CleInitiale de taille TailleCle qui est au plus 128 octets.

Dans un premier temps, la clé est expansée de la sorte à atteindre 128 octets et seuls NbBits bits dits significatifs sont conservés.

Dans un second temps, le flux est crypté par paquet de huit octets à partir deux fonctions de base Mixer et Ecraser réalisant des opérations sur les bits des octets du paquet avec la clé expansée.

Expansion de la clé

L'algorithme d'expansion de la clé utilise une table constante composées de 256 octets correspondant aux décimales de Pi :

Variable
/******/


TablePiRc2=

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

Variable
/******/


Debut
Pour I=0 JusquA TailleCle-1 Faire
Fin Pour
T8=(NbBits+7)/8;
TM=255%2^(8+NbBits-8*T8);
Pour I=TailleCle JusquA 127 Faire
Fin Pour
CleExpansee[128-T8]=TablePi[CleExpansee[128-T8]&TM];
Pour I=127-T8 JusquA 0 Faire
Fin Pour

Fonctions Mixer et Ecraser

Les fonctions Mixer et Ecraser utilisent un table de constantes TableRotations :

Variable
/******/


TableRotations=

Voici les algorithmes des fonctions Mixer et Ecraser :

/****************************************************************/
Fonction Rotation(X:Entier, N:Entier) Retourner Entier
/* Objet : X <<< N. */
/****************************************************************/
Debut
Retourner (X<<N)|(X>>(16-N));
Fin Fonction

/****************************************************************/
Procedure Mixer(Cle : Binaire, R : Tableau[4] De Nul Ou Octet, I0 : Entier, J : Entier Sortie)
/* Objet : Mixe le buffer avec la cle pour Rc2. */
/****************************************************************/
Variable
/******/


Debut
I1=(I0-1+4)%4;
I2=(I0-2+4)%4;
I3=(I0-3+4)%4;
R[I0]=R[I0]+Cle[J]+(R[I1]&R[I2])+((~R[I1])&R[I3]));
J++;
R[I0]=Rotation(R[I0],TableRotations[I0]);
Fin Procedure

/****************************************************************/
Procedure Ecraser(Cle : Binaire, R : Tableau[4] De Nul Ou Octet, I0 : Entier)
/* Objet : Ecrase le buffer avec la cle pour Rc2. */
/****************************************************************/
Variable
/******/

Debut
R[I0]=R[I0]+Cle[R[I1]&63]; Fin Procedure

Cryptage d'un bloc de huits octets

/****************************************************************/
Procedure Crypter(Cle : Binaire, B : Binaire)
/* Objet : Crypte le buffer avec la cle. */
/****************************************************************/
Variable
/******/

Debut
Pour I=0 JusquA 3 Faire
Fin Pour
J=0;
Pour I=0 JusquA 4 Faire
Fin Pour
Ecraser(Cle,R,0); Ecraser(Cle,R,1); Ecraser(Cle,R,2); Ecraser(Cle,R,3); Pour I=0 JusquA 5 Faire
Fin Pour
EcraserRc2(Cle,R,0); EcraserRc2(Cle,R,1); EcraserRc2(Cle,R,2); EcraserRc2(Cle,R,3); Pour I=0 JusquA 4 Faire
Fin Pour
Pour I=0 JusquA 3 Faire
Fin Pour
Fin Procedure

Décryptage d'un bloc de huits octets

/****************************************************************/
Procedure Derypter(Cle : Binaire, B : Binaire)
/* Objet : Decrypte le buffer avec la cle. */
/****************************************************************/
Variable
/******/

Debut
Pour I=0 JusquA 3 Faire
Fin Pour
J=63;
Pour I=0 JusquA 4 Faire
Fin Pour
Ecraser(Cle,R,0); Ecraser(Cle,R,1); Ecraser(Cle,R,2); Ecraser(Cle,R,3); Pour I=0 JusquA 5 Faire
Fin Pour
EcraserRc2(Cle,R,0); EcraserRc2(Cle,R,1); EcraserRc2(Cle,R,2); EcraserRc2(Cle,R,3); Pour I=0 JusquA 4 Faire
Fin Pour
Pour I=0 JusquA 3 Faire
Fin Pour
Fin Procedure