Fonctions de hachage à sens unique |
MD4 procède en découpant le message à digérer en blocs de 512 bits. On complète tout d'abord le message par un bit 1, concaténé à une suite de zéros, puis à la longueur du texte initial, de manière à obtenir un message d'entrée de longueur multiple de 512 bits. Ensuite on initialise le condensé de 128 bits et on parcourt chaque bloc du message 3 fois. A chaque passage, on effectue sur les mots de 32 bits du condensé des opérations logiques non-linéaires qui combinent par des fonctions OU, ET, OU-EXCLUSIF, SOMME et ROTATION le condensé déjà obtenu et le texte à digérer.
La variante MD5 est très proche de celle présentée ici. On effectue à chaque fois 4 passages, avec des fonctions logiques légèrement différentes. L'efficacité est un peu réduite, mais la sécurité est accrue.
Cet algorithme a été conçu pour des machines 32 bits. L'interface Mathematica étant indépendant de la précision, on ne peut pas exploiter cette caractéristique dans l'implementation. Il en résulte donc un exercice plutôt académique, présenté ici à titre éducatif, dont l'efficacité finale est très pauvre.
MD4[NbMessage_]:=Do[ (* convert numerical input to binary and add padding *) DataIn=IntegerDigits[NbMessage,2]; UnpaddedLength=Length[DataIn]; NZeros=512-Mod[UnpaddedLength,512]-65; If[NZeros<0,NZeros=NZeros+512]; DataIn=Flatten[ Append[DataIn,{{1},Table[0,{NZeros}],PaddedDigits[UnpaddedLength,64]}]]; DataIn=Partition[DataIn,32]; NbBlocks=Length[DataIn]/16; If[NbBlocks>1,DataIn=Partition[DataIn,16],DataIn={DataIn}]; (* define initial hash *) DH=InitHash[]; (* repeat over total number of 512-byte blocks *) Do[(* pass 1 *) Do[DH[[Ind1[[j]]]]=RotateLeft[BitSum3[DH[[Ind1[[j]]]], F[DH[[Ind2[[j]]]],DH[[Ind3[[j]]]],DH[[Ind4[[j]]]]], DataIn[[k]][[j]]],S1[[j]]];, {j,16}]; (* pass 2 *) Do[DH[[Ind1[[j]]]]=RotateLeft[BitSum4[DH[[Ind1[[j]]]], G[DH[[Ind2[[j]]]],DH[[Ind3[[j]]]],DH[[Ind4[[j]]]]],Cst1, DataIn[[k]][[X[[j]]]]],S2[[j]]];, {j,16}]; (* pass 3 *) Do[DH[[Ind1[[j]]]]=RotateLeft[BitSum4[DH[[Ind1[[j]]]], H[DH[[Ind2[[j]]]],DH[[Ind3[[j]]]],DH[[Ind4[[j]]]]],Cst2, DataIn[[k]][[R[[j]]]]],S3[[j]]];, {j,16}]; ,{k,NbBlocks}]; DH=FromDigits[Flatten[DH],2]; Return[DH]];
Le hachage de messages consécutifs ne montre aucune corrélation d'un point au suivant:
![[Graphics:hashgr2.gif]](hashgr2.gif)
La distribution des condensés de messages aléatoire est plate, comme requis:
![[Graphics:hashgr2.gif]](hashgr2.gif)