Ripe Md 160

Algorithme utilisé par Up ! Security Manager

L'algorithme Ripe Md 160 (RipeMd160) de l'université du Rhin a pour principe de calculer une signature sur 20 octets d'un flux binaire ou texte.

Cette signature permet par exemple d'attester l'intégrité du contenu d'un fichier, d'un enregistrement d'une base de données, d'un message échangé, etc. parce qu'il est pratiquement impossible que deux contenus distincts produisent la même signature.

Ainsi :

Le principe est de calculer la valeur de cinq registres conserves dans le tableau TableRegistres dont les valeurs changent par application d'opérations paramétrées par leurs valeurs précédentes et le contenu du flux.

Voici l'algorithme RipeMd160 :

Le flux est toujours prolongé de la sorte que sa taille soit toujours un multiple de 20 octets :

Les registres TableRegistres[0], TableRegistres[1], TableRegistres[2], TableRegistres[3], TableRegistres[4] sont encodés obligatoirement dans l'ordre poids faible puis poids fort.

Opérations

La variable T contient la table sinusoïdale discrète.

/****************************************************************/
Fonction RotationGauche(X:Entier, N:Entier) Retourner Entier
/* Objet : Decalage a gauche de N bits. */
/****************************************************************/
Debut
Retourner X<< Fin Fonction

/****************************************************************/
Fonction F(X:Entier, Y:Entier, Z:Entier) Retourner Entier
/* Objet : Operation F. */
/****************************************************************/
Debut
Retourner X^Y^Z;
Fin Fonction

/****************************************************************/
Fonction G(X:Entier, Y:Entier, Z:Entier) Retourner Entier
/* Objet : Operation G. */
/****************************************************************/
Debut
Retourner (X&Y)|((~X)&,Z);
Fin Fonction

/****************************************************************/
Fonction H(X:Entier, Y:Entier, Z:Entier) Retourner Entier
/* Objet : Operation H. */
/****************************************************************/
Debut
Retourner X|((~Y)^Z);
Fin Fonction

/****************************************************************/
Fonction H(X:Entier, Y:Entier, Z:Entier) Retourner Entier
/* Objet : Operation H. */
/****************************************************************/
Debut
Retourner (X&Z)|(Y&(~Z));
Fin Fonction

/****************************************************************/
Fonction I(X:Entier, Y:Entier, Z:Entier) Retourner Entier
/* Objet : Operation I. */
/****************************************************************/
Debut
Retourner X^(Y|(~Z));
Fin Fonction

/****************************************************************/
Procedure FF(A:Entier Entier Sortie, B:Entier, C:Entier Entier Sortie, D:Entier, E:Entier, X:Entier, S:Entier) Retourner Entier
/* Objet : Operation FF. */
/****************************************************************/
Debut
A+=F(B,C,D)+X;
A=RotationGauche(A,S)+E;
C=RotationGauche(C,10);
Fin Procedure

/****************************************************************/
Procedure GG(A:Entier Entier Sortie, B:Entier, C:Entier Entier Sortie, D:Entier, E:Entier, X:Entier, S:Entier) Retourner Entier
/* Objet : Operation GG. */
/****************************************************************/
Debut
A+=G(B,C,D)+X+0X5A827999;
A=RotationGauche(A,S)+E;
C=RotationGauche(C,10);
Fin Procedure

/****************************************************************/
Procedure HH(A:Entier Entier Sortie, B:Entier, C:Entier Entier Sortie, D:Entier, E:Entier, X:Entier, S:Entier) Retourner Entier
/* Objet : Operation HH. */
/****************************************************************/
Debut
A+=H(B,C,D)+X+0X6ED9EBA1;
A=RotationGauche(A,S)+E;
C=RotationGauche(C,10);
Fin Procedure

/****************************************************************/
Procedure II(A:Entier Entier Sortie, B:Entier, C:Entier Entier Sortie, D:Entier, E:Entier, X:Entier, S:Entier) Retourner Entier
/* Objet : Operation II. */
/****************************************************************/
Debut
A+=I(B,C,D)+X+0X8F1BBCDC;
A=RotationGauche(A,S)+E;
C=RotationGauche(C,10);
Fin Procedure

/****************************************************************/
Procedure JJ(A:Entier Entier Sortie, B:Entier, C:Entier Entier Sortie, D:Entier, E:Entier, X:Entier, S:Entier) Retourner Entier
/* Objet : Operation JJ. */
/****************************************************************/
Debut
A+=J(B,C,D)+X+0XA953FD4E;
A=RotationGauche(A,S)+E;
C=RotationGauche(C,10);
Fin Procedure

/****************************************************************/
Procedure FFF(A:Entier Entier Sortie, B:Entier, C:Entier Entier Sortie, D:Entier, E:Entier, X:Entier, S:Entier) Retourner Entier
/* Objet : Operation FFF. */
/****************************************************************/
Debut
A+=F(B,C,D)+X;
A=RotationGauche(A,S)+E;
C=RotationGauche(C,10);
Fin Procedure

/****************************************************************/
Procedure GGG(A:Entier Entier Sortie, B:Entier, C:Entier Entier Sortie, D:Entier, E:Entier, X:Entier, S:Entier) Retourner Entier
/* Objet : Operation GGG. */
/****************************************************************/
Debut
A+=G(B,C,D)+X+0X7A6D76E9;
A=RotationGauche(A,S)+E;
C=RotationGauche(C,10);
Fin Procedure

/****************************************************************/
Procedure HHH(A:Entier Entier Sortie, B:Entier, C:Entier Entier Sortie, D:Entier, E:Entier, X:Entier, S:Entier) Retourner Entier
/* Objet : Operation HHH. */
/****************************************************************/
Debut
A+=H(B,C,D)+X+0X6D703EF3;
A=RotationGauche(A,S)+E;
C=RotationGauche(C,10);
Fin Procedure

/****************************************************************/
Procedure III(A:Entier Entier Sortie, B:Entier, C:Entier Entier Sortie, D:Entier, E:Entier, X:Entier, S:Entier) Retourner Entier
/* Objet : Operation III. */
/****************************************************************/
Debut
A+=I(B,C,D)+X+0X5C4DD124;
A=RotationGauche(A,S)+E;
C=RotationGauche(C,10);
Fin Procedure

/****************************************************************/
Procedure JJJ(A:Entier Entier Sortie, B:Entier, C:Entier Entier Sortie, D:Entier, E:Entier, X:Entier, S:Entier) Retourner Entier
/* Objet : Operation JJJ. */
/****************************************************************/
Debut
A+=J(B,C,D)+X+0X50A28BE6;
A=RotationGauche(A,S)+E;
C=RotationGauche(C,10);
Fin Procedure