L'algorithme MD6, pour Message Digest 6, est une fonction de hachage cryptographique qui permet d'obtenir l'empreinte numérique d'un fichier (on parle souvent de message). MD6 a été développée par un groupe[1] mené par Ronald L. Rivest, cryptologue américain qui inventa MD5 et participa au développement de RSA, avec Shamir et Adleman.
MD6 a été proposée pour participer à la compétition de fonction de hachage du NIST en 2008 mais ne fut pas retenue lors de la deuxième étape de sélection.
MD6 prend en entrée un message de taille au plus bits, pour lequel il calcule une empreinte de d bits, où 0 < d ≤ 512 bits.
De même, un certain nombre de paramètres, possédant des valeurs par défaut, peuvent être modifiés :
Le mode d'opération par défaut repose sur un arbre de Merkle quaternaire.
L'unité de mesure est le mot, qui vaut 8 octets, ou 64 bits.
Les feuilles de l'arbre proviennent du fichier à hacher. Elles sont éventuellement complétées par des 0 pour obtenir des feuilles de taille 16 mots, soit 128 octets ou 1024 bits. De plus, chaque nœud ayant 4 fils, des feuilles/nœuds supplémentaires composés de 0 sont ajoutés pour obtenir le bon nombre de feuilles/nœuds. Chaque bloc, composé de quatre nœuds, est compressé (avec la fonction de compression détaillée dans la partie suivante) pour obtenir en sortie un nœud de taille 16 mots.
Ainsi, on remonte dans l'arbre jusqu'à n'avoir plus qu'un seul nœud : la racine.
L'empreinte de la fonction de hachage est calculée en tronquant les d derniers bits de la racine de l'arbre (256 par défaut).
La fonction de compression prend en entrée un vecteur de 89 mots, composé des éléments suivants :
La fonction de compression, effectue ensuite r tours (par défaut 104), composé chacun de 16 boucles indépendantes. Chacune de ses 16 boucles effectue une quinzaine d'opérations logiques ou de décalage de bits (les opérations logiques sont préférées aux opérations arithmétiques et aux opérations dépendant de branchement afin d'empêcher les attaques par canaux auxiliaires).
Chaque tour calcule 89 mots, à partir des 89 mots calculés précédemment (les 89 premières valeurs sont le vecteur de 89 mots passé en entrée de la fonction de compression).
Les 64 derniers mots calculés sont la sortie de la fonction de compression.