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 :
Variable
/******/
TableRegistres : Tableau[5] De Nul Ou Entier;
TableRegistres[0]=0x67452301;
TableRegistres[1]=0xefcdab89;
TableRegistres[2]=0x98badcfe;
TableRegistres[3]=0x10325476;
TableRegistres[4]=0xc3d2e1f0;
Variable
/******/
AA : Entier;
BB : Entier;
CC : Entier;
DD : Entier;
EE : Entier;
AAA : Entier;
BBB : Entier;
CCC : Entier;
DDD : Entier;
EEE : Entier;
AA=TableRegistres[0];
BB=TableRegistres[1];
CC=TableRegistres[2];
DD=TableRegistres[3];
EE=TableRegistres[4];
AAA=TableRegistres[0];
BBB=TableRegistres[1];
CCC=TableRegistres[2];
DDD=TableRegistres[3];
EEE=TableRegistres[4];
FF(AA, BB, CC, DD, EE, X[ 0], 11);
FF(EE, AA, BB, CC, DD, X[ 1], 14);
FF(DD, EE, AA, BB, CC, X[ 2], 15);
FF(CC, DD, EE, AA, BB, X[ 3], 12);
FF(BB, CC, DD, EE, AA, X[ 4], 5);
FF(AA, BB, CC, DD, EE, X[ 5], 8);
FF(EE, AA, BB, CC, DD, X[ 6], 7);
FF(DD, EE, AA, BB, CC, X[ 7], 9);
FF(CC, DD, EE, AA, BB, X[ 8], 11);
FF(BB, CC, DD, EE, AA, X[ 9], 13);
FF(AA, BB, CC, DD, EE, X[10], 14);
FF(EE, AA, BB, CC, DD, X[11], 15);
FF(DD, EE, AA, BB, CC, X[12], 6);
FF(CC, DD, EE, AA, BB, X[13], 7);
FF(BB, CC, DD, EE, AA, X[14], 9);
FF(AA, BB, CC, DD, EE, X[15], 8);
GG(EE, AA, BB, CC, DD, X[ 7], 7);
GG(DD, EE, AA, BB, CC, X[ 4], 6);
GG(CC, DD, EE, AA, BB, X[13], 8);
GG(BB, CC, DD, EE, AA, X[ 1], 13);
GG(AA, BB, CC, DD, EE, X[10], 11);
GG(EE, AA, BB, CC, DD, X[ 6], 9);
GG(DD, EE, AA, BB, CC, X[15], 7);
GG(CC, DD, EE, AA, BB, X[ 3], 15);
GG(BB, CC, DD, EE, AA, X[12], 7);
GG(AA, BB, CC, DD, EE, X[ 0], 12);
GG(EE, AA, BB, CC, DD, X[ 9], 15);
GG(DD, EE, AA, BB, CC, X[ 5], 9);
GG(CC, DD, EE, AA, BB, X[ 2], 11);
GG(BB, CC, DD, EE, AA, X[14], 7);
GG(AA, BB, CC, DD, EE, X[11], 13);
GG(EE, AA, BB, CC, DD, X[ 8], 12);
HH(DD, EE, AA, BB, CC, X[ 3], 11);
HH(CC, DD, EE, AA, BB, X[10], 13);
HH(BB, CC, DD, EE, AA, X[14], 6);
HH(AA, BB, CC, DD, EE, X[ 4], 7);
HH(EE, AA, BB, CC, DD, X[ 9], 14);
HH(DD, EE, AA, BB, CC, X[15], 9);
HH(CC, DD, EE, AA, BB, X[ 8], 13);
HH(BB, CC, DD, EE, AA, X[ 1], 15);
HH(AA, BB, CC, DD, EE, X[ 2], 14);
HH(EE, AA, BB, CC, DD, X[ 7], 8);
HH(DD, EE, AA, BB, CC, X[ 0], 13);
HH(CC, DD, EE, AA, BB, X[ 6], 6);
HH(BB, CC, DD, EE, AA, X[13], 5);
HH(AA, BB, CC, DD, EE, X[11], 12);
HH(EE, AA, BB, CC, DD, X[ 5], 7);
HH(DD, EE, AA, BB, CC, X[12], 5);
II(CC, DD, EE, AA, BB, X[ 1], 11);
II(BB, CC, DD, EE, AA, X[ 9], 12);
II(AA, BB, CC, DD, EE, X[11], 14);
II(EE, AA, BB, CC, DD, X[10], 15);
II(DD, EE, AA, BB, CC, X[ 0], 14);
II(CC, DD, EE, AA, BB, X[ 8], 15);
II(BB, CC, DD, EE, AA, X[12], 9);
II(AA, BB, CC, DD, EE, X[ 4], 8);
II(EE, AA, BB, CC, DD, X[13], 9);
II(DD, EE, AA, BB, CC, X[ 3], 14);
II(CC, DD, EE, AA, BB, X[ 7], 5);
II(BB, CC, DD, EE, AA, X[15], 6);
II(AA, BB, CC, DD, EE, X[14], 8);
II(EE, AA, BB, CC, DD, X[ 5], 6);
II(DD, EE, AA, BB, CC, X[ 6], 5);
II(CC, DD, EE, AA, BB, X[ 2], 12);
JJ(BB, CC, DD, EE, AA, X[ 4], 9);
JJ(AA, BB, CC, DD, EE, X[ 0], 15);
JJ(EE, AA, BB, CC, DD, X[ 5], 5);
JJ(DD, EE, AA, BB, CC, X[ 9], 11);
JJ(CC, DD, EE, AA, BB, X[ 7], 6);
JJ(BB, CC, DD, EE, AA, X[12], 8);
JJ(AA, BB, CC, DD, EE, X[ 2], 13);
JJ(EE, AA, BB, CC, DD, X[10], 12);
JJ(DD, EE, AA, BB, CC, X[14], 5);
JJ(CC, DD, EE, AA, BB, X[ 1], 12);
JJ(BB, CC, DD, EE, AA, X[ 3], 13);
JJ(AA, BB, CC, DD, EE, X[ 8], 14);
JJ(EE, AA, BB, CC, DD, X[11], 11);
JJ(DD, EE, AA, BB, CC, X[ 6], 8);
JJ(CC, DD, EE, AA, BB, X[15], 5);
JJ(BB, CC, DD, EE, AA, X[13], 6);
JJJ(AAA, BBB, CCC, DDD, EEE, X[ 5], 8);
JJJ(EEE, AAA, BBB, CCC, DDD, X[14], 9);
JJJ(DDD, EEE, AAA, BBB, CCC, X[ 7], 9);
JJJ(CCC, DDD, EEE, AAA, BBB, X[ 0], 11);
JJJ(BBB, CCC, DDD, EEE, AAA, X[ 9], 13);
JJJ(AAA, BBB, CCC, DDD, EEE, X[ 2], 15);
JJJ(EEE, AAA, BBB, CCC, DDD, X[11], 15);
JJJ(DDD, EEE, AAA, BBB, CCC, X[ 4], 5);
JJJ(CCC, DDD, EEE, AAA, BBB, X[13], 7);
JJJ(BBB, CCC, DDD, EEE, AAA, X[ 6], 7);
JJJ(AAA, BBB, CCC, DDD, EEE, X[15], 8);
JJJ(EEE, AAA, BBB, CCC, DDD, X[ 8], 11);
JJJ(DDD, EEE, AAA, BBB, CCC, X[ 1], 14);
JJJ(CCC, DDD, EEE, AAA, BBB, X[10], 14);
JJJ(BBB, CCC, DDD, EEE, AAA, X[ 3], 12);
JJJ(AAA, BBB, CCC, DDD, EEE, X[12], 6);
III(EEE, AAA, BBB, CCC, DDD, X[ 6], 9);
III(DDD, EEE, AAA, BBB, CCC, X[11], 13);
III(CCC, DDD, EEE, AAA, BBB, X[ 3], 15);
III(BBB, CCC, DDD, EEE, AAA, X[ 7], 7);
III(AAA, BBB, CCC, DDD, EEE, X[ 0], 12);
III(EEE, AAA, BBB, CCC, DDD, X[13], 8);
III(DDD, EEE, AAA, BBB, CCC, X[ 5], 9);
III(CCC, DDD, EEE, AAA, BBB, X[10], 11);
III(BBB, CCC, DDD, EEE, AAA, X[14], 7);
III(AAA, BBB, CCC, DDD, EEE, X[15], 7);
III(EEE, AAA, BBB, CCC, DDD, X[ 8], 12);
III(DDD, EEE, AAA, BBB, CCC, X[12], 7);
III(CCC, DDD, EEE, AAA, BBB, X[ 4], 6);
III(BBB, CCC, DDD, EEE, AAA, X[ 9], 15);
III(AAA, BBB, CCC, DDD, EEE, X[ 1], 13);
III(EEE, AAA, BBB, CCC, DDD, X[ 2], 11);
HHH(DDD, EEE, AAA, BBB, CCC, X[15], 9);
HHH(CCC, DDD, EEE, AAA, BBB, X[ 5], 7);
HHH(BBB, CCC, DDD, EEE, AAA, X[ 1], 15);
HHH(AAA, BBB, CCC, DDD, EEE, X[ 3], 11);
HHH(EEE, AAA, BBB, CCC, DDD, X[ 7], 8);
HHH(DDD, EEE, AAA, BBB, CCC, X[14], 6);
HHH(CCC, DDD, EEE, AAA, BBB, X[ 6], 6);
HHH(BBB, CCC, DDD, EEE, AAA, X[ 9], 14);
HHH(AAA, BBB, CCC, DDD, EEE, X[11], 12);
HHH(EEE, AAA, BBB, CCC, DDD, X[ 8], 13);
HHH(DDD, EEE, AAA, BBB, CCC, X[12], 5);
HHH(CCC, DDD, EEE, AAA, BBB, X[ 2], 14);
HHH(BBB, CCC, DDD, EEE, AAA, X[10], 13);
HHH(AAA, BBB, CCC, DDD, EEE, X[ 0], 13);
HHH(EEE, AAA, BBB, CCC, DDD, X[ 4], 7);
HHH(DDD, EEE, AAA, BBB, CCC, X[13], 5);
GGG(CCC, DDD, EEE, AAA, BBB, X[ 8], 15);
GGG(BBB, CCC, DDD, EEE, AAA, X[ 6], 5);
GGG(AAA, BBB, CCC, DDD, EEE, X[ 4], 8);
GGG(EEE, AAA, BBB, CCC, DDD, X[ 1], 11);
GGG(DDD, EEE, AAA, BBB, CCC, X[ 3], 14);
GGG(CCC, DDD, EEE, AAA, BBB, X[11], 14);
GGG(BBB, CCC, DDD, EEE, AAA, X[15], 6);
GGG(AAA, BBB, CCC, DDD, EEE, X[ 0], 14);
GGG(EEE, AAA, BBB, CCC, DDD, X[ 5], 6);
GGG(DDD, EEE, AAA, BBB, CCC, X[12], 9);
GGG(CCC, DDD, EEE, AAA, BBB, X[ 2], 12);
GGG(BBB, CCC, DDD, EEE, AAA, X[13], 9);
GGG(AAA, BBB, CCC, DDD, EEE, X[ 9], 12);
GGG(EEE, AAA, BBB, CCC, DDD, X[ 7], 5);
GGG(DDD, EEE, AAA, BBB, CCC, X[10], 15);
GGG(CCC, DDD, EEE, AAA, BBB, X[14], 8);
FFF(BBB, CCC, DDD, EEE, AAA, X[12] , 8);
FFF(AAA, BBB, CCC, DDD, EEE, X[15] , 5);
FFF(EEE, AAA, BBB, CCC, DDD, X[10] , 12);
FFF(DDD, EEE, AAA, BBB, CCC, X[ 4] , 9);
FFF(CCC, DDD, EEE, AAA, BBB, X[ 1] , 12);
FFF(BBB, CCC, DDD, EEE, AAA, X[ 5] , 5);
FFF(AAA, BBB, CCC, DDD, EEE, X[ 8] , 14);
FFF(EEE, AAA, BBB, CCC, DDD, X[ 7] , 6);
FFF(DDD, EEE, AAA, BBB, CCC, X[ 6] , 8);
FFF(CCC, DDD, EEE, AAA, BBB, X[ 2] , 13);
FFF(BBB, CCC, DDD, EEE, AAA, X[13] , 6);
FFF(AAA, BBB, CCC, DDD, EEE, X[14] , 5);
FFF(EEE, AAA, BBB, CCC, DDD, X[ 0] , 15);
FFF(DDD, EEE, AAA, BBB, CCC, X[ 3] , 13);
FFF(CCC, DDD, EEE, AAA, BBB, X[ 9] , 11);
FFF(BBB, CCC, DDD, EEE, AAA, X[11] , 11);
DDD+=CC+TableRegistres[1];
TableRegistres[1]=TableRegistres[2]+DD+EEE;
TableRegistres[2]=TableRegistres[3]+EE+AAA;
TableRegistres[3]=TableRegistres[4]+AA+BBB;
TableRegistres[4]=TableRegistres[0]+BB+CCC;
TableRegistres[0]=DDD;
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.
/****************************************************************/
Fonction RotationGauche(X:Entier, N:Entier) Retourner Entier
/* Objet : Decalage a gauche de N bits. */
/****************************************************************/
Debut
Retourner X<<
/****************************************************************/
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