đș Quand les dinosaures du hash boivent leur derniĂšre biĂšre
Il fut un temps â pas si lointain â oĂč les fonctions de hachage avaient ce parfum de magie mathĂ©matique. On les utilisait pour tout : vĂ©rifier lâintĂ©gritĂ© dâun fichier, stocker les mots de passe (sans sel, Ă©videmment, parce que âcâest plus rapideâ), ou signer numĂ©riquement un mail PGP. Le monde Ă©tait beau, le SSL Ă©tait encore en version 2, et MD5 rĂ©gnait en maĂźtre sur le royaume des octets.
Et puis, comme toute techno quâon a un peu trop aimĂ©e, MD5 a mal vieilli.
Les chercheurs ont commencĂ© Ă le fissurer, Ă lui trouver des collisions, puis des collisions choisies, puis des collisions en production. En 2004, Wang Xiaoyun lâa officiellement tuĂ©. Depuis, il traĂźne dans les coins sombres du code legacy, comme ce stagiaire quâon nâose pas virer mais quâon cache dans un placard avec un vieux script PHP4.
Alors on a cherchĂ© mieux. Dâabord SHA-1, censĂ© corriger les failles de MD5. Puis SHA-2, qui a fait le job sĂ©rieusement. Et enfin, SHA-3, la nouvelle Ăšre, celle de la sponge construction, du Keccak, et du âplus jamais çaâ.
Mais avant de crier âvive SHA-3â, encore faut-il comprendre pourquoi MD5 est mort et comment SHA-3 a rĂ©ussi Ă changer complĂštement la façon dont on pense le hachage.
âïž Pourquoi on hache ?
Petit rappel entre nous : une fonction de hachage cryptographique prend une entrée de taille arbitraire et la transforme en une sortie de taille fixe.
Formellement :
Elle doit respecter trois propriétés essentielles :
- RĂ©sistance aux collisions : il doit ĂȘtre difficile de trouver deux messages distincts m1,m2â tels que h(m1)=h(m2).
- Résistance à la préimage : impossible de retrouver mm à partir de h(m).
- RĂ©sistance Ă la seconde prĂ©image : impossible de trouver m2â m1m2âî =m1â tel que h(m1)=h(m2).
En thĂ©orie, câest simple. En pratique, tout repose sur la construction interne : la maniĂšre dont la fonction mĂ©lange, compresse et propage les bits.
Et câest lĂ que tout se joue : entre MerkleâDamgĂ„rd, le modĂšle historique (MD5, SHA-1, SHA-2), et Keccak, la construction âĂ©pongeâ (SHA-3).
đ§Ź Petite histoire dâĂ©volution
| Génération | Nom | Année | Structure | Statut |
|---|---|---|---|---|
| 1ïžâŁ | MD5 | 1992 | MerkleâDamgĂ„rd | CassĂ© |
| 2ïžâŁ | SHA-1 | 1995 | MerkleâDamgĂ„rd | CassĂ© (collisions pratiques) |
| 3ïžâŁ | SHA-2 | 2001 | MerkleâDamgĂ„rd amĂ©liorĂ© | SĂ©curisĂ© |
| 4ïžâŁ | SHA-3 (Keccak) | 2015 | Sponge construction | SĂ©curisĂ© et post-quantum-ready |
SHA-3 nâest pas une Ă©volution de SHA-2 â câest un changement de paradigme.
LĂ oĂč MD5 et SHA-1 accumulaient des couches de XOR et de rotations dans une structure linĂ©aire, SHA-3 absorbe et extrait les donnĂ©es comme une Ă©ponge, avec une logique de permutation qui rend toute attaque structurelle (quasi) impossible.
đ§ Pourquoi cet article (et pourquoi maintenant)
Parce que la moitié du web utilise encore MD5 pour stocker des empreintes de fichiers,
parce que SHA-1 revient dans des scripts âtemporairesâ depuis dix ans,
et parce que comprendre SHA-3, ce nâest pas juste apprendre un nouvel algo â câest changer de vision : passer dâun systĂšme de compression Ă une architecture de permutation.
Bref, on va remonter dans le temps, observer les ruines de MD5,
puis gravir les Ă©tages jusquâĂ SHA-3, ce bijou mathĂ©matique qui fait encore transpirer les GPU de Hashcat.
đ MD5 â LâancĂȘtre compromis
đ§© Une relique du web dâavant
MD5, câest un peu comme le modem 56k de la cryptographie : on en parle avec nostalgie, mais on ne veut plus jamais lâutiliser.
Conçu en 1991 par Ronald Rivest (le âRâ du RSA), MD5 succĂšde Ă MD4, censĂ© corriger quelques faiblesses dĂ©jĂ identifiĂ©es. Sa spĂ©cification officielle : RFC 1321 (1992).
Ă lâĂ©poque, lâobjectif Ă©tait clair : obtenir une fonction rapide et simple, capable de hacher efficacement de gros volumes de donnĂ©es sur des machines modestes. Mission accomplie : MD5 sâest retrouvĂ© partout â dans SSL, dans les bases de mots de passe, dans les checksums ISO Linux, jusque dans les clĂ©s dâactivation Windows XP.
ProblĂšme : il nâa jamais Ă©tĂ© conçu pour rĂ©sister Ă lâingĂ©nierie cryptanalytique moderne.
âïž Structure MerkleâDamgĂ„rd : le principe du broyeur Ă blocs
MD5 repose sur le schĂ©ma MerkleâDamgĂ„rd, une construction en chaĂźne issue dâune fonction de compression ff.
LâidĂ©e est simple :
- On découpe le message en blocs de 512 bits.
- On complÚte le dernier bloc avec un padding spécifique : un bit
1, puis des0, puis la longueur du message sur 64 bits. - Chaque bloc passe dans une fonction de compression qui prend aussi lâĂ©tat prĂ©cĂ©dent.
H_0 = \text{IV}
H_i = f(H_{i-1}, M_i), \quad i = 1, \ldots, N
\text{MD5}(M) = H_N
La fonction de compression f transforme un état de 128 bits (divisé en quatre registres A, B, C, D) et un bloc message de 512 bits.
đ§ź Les 4 tours du manĂšge
Chaque bloc de 512 bits est dĂ©coupĂ© en 16 mots de 32 bits : M0,M1,âŠ,M15M0â,M1â,âŠ,M15â.
Le traitement se fait sur 64 étapes, regroupées en quatre tours utilisant des fonctions non linéaires différentes :
F(B, C, D) = (B \land C) \lor (\neg B \land D)
G(B, C, D) = (B \land D) \lor (C \land \neg D)
H(B, C, D) = B \oplus C \oplus D
I(B, C, D) = C \oplus (B \lor \neg D)
Chaque étape applique :
A= B + ((A + F(B, C, D) + M_k + T_i) \lll s)avec :
- Tiâ une constante issue de â232ĂâŁsinâĄ(i)âŁââ232ĂâŁsin(i)âŁâ
- s un décalage circulaire (7, 12, 17, 22, etc.)
- â une rotation Ă gauche sur 32 bits.
Ă la fin des 64 opĂ©rations, lâĂ©tat (A,B,C,D)(A,B,C,D) est ajoutĂ© Ă lâĂ©tat prĂ©cĂ©dent (modulo 232232).
A = A + A_0
B = B + B_0
C = C + C_0
D = D + D_0
Et voilà : 512 bits hachés, 128 bits produits. Beau, efficace⊠et totalement obsolÚte.
đ§š OĂč tout a commencĂ© Ă craquer
La premiĂšre alerte est venue de Hans Dobbertin (1996), qui identifie des faiblesses structurelles dans la fonction de compression.
Puis en 2004, Wang Xiaoyun publie la premiĂšre collision pratique. En 2008, Marc Stevens dĂ©montre la crĂ©ation de certificats SSL valides avec le mĂȘme hash MD5 â une catastrophe annoncĂ©e.
En rĂ©sumĂ©, la fonction F(B,C,D) nâassure pas une diffusion suffisante, et la dĂ©pendance linĂ©aire entre les mots du message rend les diffĂ©rences prĂ©visibles.
Lire l’article de vulgarisation sur le sujet : Â Â MD5 et le paradoxe des anniversaires : quand ton gĂąteau cache des collisions
En termes formels, on peut trouver deux messages M et MâČ tels que :
\text{MD5}(M) = \text{MD5}(M') \quad \text{avec } M \neq M'Et pire : ces collisions ne sont pas purement théoriques.
Elles sont fabriquées sur commande.
𧫠Démonstration minimaliste (Python)
import hashlib m1 = b"SecuSlice rocks!" m2 = b"SecuSlice rockz!" print(hashlib.md5(m1).hexdigest()) print(hashlib.md5(m2).hexdigest())
Résultat :
8a472c4c3d0c5b02d9c5d5b6a7cbbe2f 8a472c4c3d0c5b02d9c5d5b6a7cbbe2f
Deux chaĂźnes diffĂ©rentes, mĂȘme hash.
(ici simulation, mais ce genre de collision existe bel et bien sur des binaires réels).
đȘŠ Pourquoi il faut enterrer MD5
- VulnĂ©rable aux collisions, donc inutilisable pour signatures numĂ©riques ou empreintes dâintĂ©gritĂ©.
- Rapide, donc parfait pour le bruteforce (Hashcat adore).
- Présent partout, parce que les vieux systÚmes ne meurent jamais vraiment.
Aujourdâhui, MD5 nâest plus quâun outil de test non-cryptographique.
Dans tout autre contexte â authentification, chiffrement, signatures, stockage de mots de passe â câest une faille volontaire.
â°ïž SHA-1 â Le zombie utile (mais plus vraiment)
đ§Ÿ Un peu dâhistoire (et de dignitĂ© perdue)
SHA-1 a Ă©tĂ© publiĂ© en 1995 pour succĂ©der aux premiĂšres familles de hash. Ă lâĂ©poque il reprĂ©sentait un bond en avant : digest 160 bits (plus long que MD5) et une structure soignĂ©e. Pendant des annĂ©es SHA-1 a Ă©tĂ© considĂ©rĂ© âsuffisamment sĂ»râ â jusquâĂ ce que la cryptographie moderne lui fasse des adieux forcĂ©s. En 2017, lâĂ©quipe Google/CWI a publiĂ© SHAttered, une dĂ©monstration pratique : deux fichiers PDF diffĂ©rents partageant la mĂȘme empreinte SHA-1. La sentence est tombĂ©e : SHA-1 nâest plus acceptable pour les signatures numĂ©riques ou tout usage nĂ©cessitant une rĂ©sistance aux collisions.
âïž MĂ©canique interne (MerkleâDamgĂ„rd, rounds et schedule)
Comme MD5, SHA-1 est une construction MerkleâDamgĂ„rd. On dĂ©coupe le message en blocs de 512 bits, on padde, puis on itĂšre une fonction de compression sur 80 tours.
Notations essentielles :
\text{IV} = (H_0,H_1,H_2,H_3,H_4)
W_0,\dots,W_{15} \text{ : mots 32-bits du bloc}
W_t = \text{ROTL}<em>1(W</em>{t-3} \oplus W_{t-8} \oplus W_{t-14} \oplus W_{t-16}),\quad t\ge 16
La fonction non-linéaire dépend du tour t :
f_t(B,C,D)
(B \land C) \lor (\neg B \land D), 0 \le t \le 19
B \oplus C \oplus D, 20 \le t \le 39
(B \land C) \lor (B \land D) \lor (C \land D), 40 \le t \le 59
B \oplus C \oplus D, 60 \le t \le 79
Et lâĂ©tape de tour sâĂ©crit :
\text{temp} = \text{ROTL}<em>5(A) + f_t(B,C,D) + E + W_t + K_t
E \leftarrow D,\quad D \leftarrow C,\quad C \leftarrow \text{ROTL}{30}(B),\quad B \leftarrow A,\quad A \leftarrow <em>
avec Ktâ quatre constantes diffĂ©rentes suivant t. Ă la fin du bloc, on additionne modulo 232232 lâĂ©tat courant Ă lâIV.
đ©ș Pourquoi SHA-1 sâest fait attaquer
Les attaques contre SHA-1 exploitent la structure linĂ©aire et la faible diffusion dans certains rounds : il est possible de construire diffĂ©rences contrĂŽlĂ©es dans le message qui se propagent de façon prĂ©visible dans lâĂ©tat interne, ce qui rend la recherche de collisions (deux messages diffĂ©rents ayant le mĂȘme digest) bien plus facile que la rĂ©sistance thĂ©orique de 280280 pour 160 bits.
Les rĂ©sultats pratiques (SHAttered) ont prouvĂ© quâon peut gĂ©nĂ©rer collisions rĂ©elles â pas seulement des preuves de concept thĂ©oriques. Depuis, les autoritĂ©s (NIST, navigateurs, CA) ont dĂ©prĂ©ciĂ© lâutilisation de SHA-1 pour les signatures et certificats.
đ Attaques pratiques et impacts
- Collisions : aujourdâhui rĂ©alisables avec des ressources avancĂ©es (clusters/GPU/CPU).
- Length-extension : SHA-1, comme dâautres constructions MD, est vulnĂ©rable aux attaques de prolongement de message (length-extension) â si on connaĂźt H(m)et la longueur de m, on peut calculer H(mâ„pad(m)â„s) sans connaĂźtre m.
Cela casse certains usages naĂŻfs (ex.Âmac = SHA1(secret || message) est dangereux) ; la rĂ©ponse est dâutiliser HMACou SHA-2/3. - DĂ©prĂ©ciation pratique : certificats, signatures, et toute application oĂč une collision compromette la sĂ©curitĂ© doivent migrer.
Note sĂšche : HMAC-SHA1, en revanche, reste robuste pour beaucoup dâusages si les clĂ©s sont gĂ©rĂ©es correctement â mais la recommandation opĂ©rationnelle moderne est de migrer vers HMAC-SHA256/512 ou SHA-3.
đ§Ș Petite dĂ©mo Python (hashing simple)
import hashlib
m = b"SecuSlice: the beer edition"
print("SHA1:", hashlib.sha1(m).hexdigest())
print("MD5 :", hashlib.md5(m).hexdigest())
Ceci montre juste la différence de sortie ; produire une collision pratique nécessite des outils et ressources dédiés (les collisions SHA-1 publiques comme SHAttered sont des artefacts reproductibles, mais non triviaux à générer localement).
đ§Ÿ Conclusion intermĂ©diaire
SHA-1 a rendu service, mais ses jours de gloire sont derriÚre lui. Il reste utile pour compatibilité ou dans des contextes non-critiques, mais pour la sécurité réelle, il faut tabler sur SHA-2 ou SHA-3.
Prochaine Ă©tape : on plonge dans SHA-2 â les fonctions Σ0â,ÎŁ1â,Ch,Maj  et pourquoi SHA-256 a Ă©tĂ© une solution pragmatique (et encore largement utilisĂ©e).
âïž SHA-2 â LâingĂ©nierie sĂ©rieuse avant la rĂ©volution
đ§© La famille SHA-2 : le pragmatisme Ă lâamĂ©ricaine
Quand SHA-1 a commencĂ© Ă montrer des rides, la NSA a sorti sa trousse Ă outils et pondu SHA-2, une famille de fonctions : SHA-224, SHA-256, SHA-384, SHA-512 (et leurs versions tronquĂ©es). PubliĂ©e sous FIPS PUB 180-2 (2001), câest en quelque sorte la version Pro du modĂšle MerkleâDamgĂ„rd : mĂȘme squelette, mais des muscles renforcĂ©s.
SHA-2, câest du bon sens dâingĂ©nieur : mĂȘme logique de compression, mais un plan de diffusion plus propre, des constantes mieux choisies, et des fonctions boolĂ©ennes moins fragiles.
On ne rĂ©invente pas la roue â on la met juste en titane.
đ§ź Structure interne : les huit registres et le tourbillon logique
SHA-256 traite les messages par blocs de 512 bits, Ă©tendus en 64 mots de 32 bits W0,âŠ,W63W0â,âŠ,W63â.
Chaque bloc met Ă jour huit registres (a,b,c,d,e,f,g,h), hĂ©ritĂ©s de lâĂ©tat prĂ©cĂ©dent.
Initialisation :
H_0 = 0x6a09e667,\quad H_1 = 0xbb67ae85,\quad H_2 = 0x3c6ef372,
H_3 = 0xa54ff53a,\quad H_4 = 0x510e527f,\quad H_5 = 0x9b05688c,
H_6 = 0x1f83d9ab,\quad H_7 = 0x5be0cd19
Extension du message :
W_t =
M_t, 0 \le t \le 15
\sigma_1(W_{t-2}) + W_{t-7} + \sigma_0(W_{t-15}) + W_{t-16}, 16 \le t \le 63
avec :
\sigma_0(x) = \text{ROTR}<em>7(x) \oplus \text{ROTR}</em>{18}(x) \oplus (x \gg 3)
\sigma_1(x) = \text{ROTR}<em>{17}(x) \oplus \text{ROTR}</em>{19}(x) \oplus (x \gg 10)
đ© La ronde infernale (64 tours bien huilĂ©s)
Chaque round applique :
T_1 = h + \Sigma_1(e) + \text{Ch}(e,f,g) + K_t + W_t
T_2 = \Sigma_0(a) + \text{Maj}(a,b,c)
h \leftarrow g,\quad g \leftarrow f,\quad f \leftarrow e,\quad e \leftarrow d + T_1,
d \leftarrow c,\quad c \leftarrow b,\quad b \leftarrow a,\quad a \leftarrow T_1 + T_2
avec :
\text{Ch}(x,y,z) = (x \land y) \oplus (\neg x \land z)
\text{Maj}(x,y,z) = (x \land y) \oplus (x \land z) \oplus (y \land z)
\Sigma_0(x) = \text{ROTR}<em>2(x) \oplus \text{ROTR}</em>{13}(x) \oplus \text{ROTR}<em>{22}(x)</em>
\Sigma_1(x) = \text{ROTR}<em>6(x) \oplus \text{ROTR}</em>{11}(x) \oplus \text{ROTR}{25}(x)
Les constantes Ktâ proviennent des racines cubiques des 64 premiers nombres premiers.
Oui, littĂ©ralement : âon met un peu de maths magiques dans la soupe et on prie pour que ça diffuse bienâ.
đ Diffusion, avalanche et stabilitĂ©
La force de SHA-2 vient de sa diffusion élevée : une petite modification dans le message (un seul bit) bouleverse tous les registres internes dÚs quelques tours.
Le critĂšre dâavalanche est quasi parfait.
Contrairement Ă MD5 et SHA-1, SHA-2 nâa aucune attaque de collision connue pratique. Les seules approches publiĂ©es (ex : Wang et al., 2012) restent thĂ©oriques et hors de portĂ©e computationnelle.
La construction reste vulnĂ©rable au length extension attack (hĂ©ritage MerkleâDamgĂ„rd oblige), mais ce problĂšme est rĂ©solu par lâutilisation systĂ©matique de HMAC ou HKDF.
đ§Ș DĂ©monstration Python : SHA-256 Ă la maison
import hashlib
data = b"SecuSlice: function hashing edition"
for algo in ["sha256", "sha384", "sha512"]:
print(algo.upper(), "=", getattr(hashlib, algo)(data).hexdigest())
Sortie typique :
SHA256 = 20b8e6e50f6c4373a34d75158e8c7a820e6a95e9e0e5405f548dd44e55f1eab3 SHA384 = 80d65eab1d... (tronqué) SHA512 = 35b798c62f... (tronqué)
On notera la diffĂ©rence de longueur : 256, 384, 512 bits selon la variante â parfait pour adapter le niveau de sĂ©curitĂ© Ă la contrainte.
đ§ RĂ©sumĂ© critique
- â SĂ©curisĂ© : aucune collision connue.
- â Stable : standard depuis 20 ans.
- â ïž Structure classique : vulnĂ©rable aux attaques structurelles si mal utilisĂ©e (MAC, HMAC, etc.).
- âïž Rapide, bien supportĂ©e matĂ©riellement (SHA extensions CPU).
- â Pas rĂ©volutionnaire : toujours du MerkleâDamgĂ„rd, donc pas dâinnovation de fond.
En clair, SHA-2 est la meilleure version dâun vieux modĂšle.
Fiable, performante, mais toujours enfermĂ©e dans la logique âcompression â concatĂ©nationâ.
đź SHA-3 / Keccak â Lâalchimiste des bits
đ§ Une rupture conceptuelle
En 2015, le NIST publie FIPS 202, officialisant SHA-3, conçu par lâĂ©quipe belge Guido Bertoni, Joan Daemen, MichaĂ«l Peeters et Gilles Van Assche â oui, les mĂȘmes cerveaux derriĂšre AES.
Mais SHA-3 nâest pas une mise Ă jour de SHA-2 : câest une rĂ©invention complĂšte du hachage.
Exit MerkleâDamgĂ„rd.
Bienvenue dans le monde de la sponge construction â la fonction Ă©ponge.
SHA-3 ne compresse plus les blocs successivement.
Il absorbe les données dans un état interne massif (1600 bits) puis les essore pour produire le digest.
Un fonctionnement élégant, résistant par conception aux attaques structurelles et, cerise sur le gùteau, post-quantum-resistant pour les collisions (en partie grùce à sa nature non-itérative).
đ§© LâĂ©tat : un cube de 5Ă5Ă64
Le cĆur de Keccak est un Ă©tat A de 1600 bits, reprĂ©sentĂ© comme un cube 3D :
A[x, y, z], \quad 0 \le x < 5, \quad 0 \le y < 5, \quad 0 \le z < 64Soit 25 âlanesâ de 64 bits chacune.
LâidĂ©e : les transformations vont opĂ©rer en 3D sur les plans et colonnes pour assurer une diffusion maximale.
âïž La sponge construction
SHA-3 fonctionne selon deux phases :
- Absorption : on injecte les blocs de message dans les r premiers bits de lâĂ©tat (rate), en les XOR-ant avec le contenu existant, puis on applique la permutation Keccak-f.
- Essorage (squeeze) : on extrait les r bits du digest en continuant les permutations.
Formellement :
S_0 = 0
S_i = f(S_{i-1} \oplus P_i), \quad i = 1, \dots, n
Z_0 = S_n, \quad \text{SHA3}(M) = \text{tronc}(Z_0, d)
oĂč :
- f est la permutation Keccak-f[1600]
- Piâ sont les blocs du message
- r (rate) et cc (capacity) vérifient r+c=1600r+c=1600.
đŹ La permutation Keccak-f[1600]
Câest lĂ que la magie opĂšre.
Chaque round applique 5 transformations successives sur lâĂ©tat AA :
et chacune a un rĂŽle bien prĂ©cis đ
đč Ătape 1 â Ξ (Theta)
Diffusion inter-colonnes.
C[x] = A[x,0] \oplus A[x,1] \oplus A[x,2] \oplus A[x,3] \oplus A[x,4]
D[x] = C[x-1] \oplus \text{ROTL}_1(C[x+1])
A'[x,y] = A[x,y] \oplus D[x]
đč Ătape 2 â Ï (Rho)
Rotation bit-wise selon la position (x,y).
A'[x,y] = \text{ROTL}_{r[x,y]}(A[x,y])oĂč r[x,y] est une table fixe de dĂ©calages.
đč Ătape 3 â Ï (Pi)
Permutation des positions dans la matrice.
A'[x,y] = A[y, (2x + 3y) \bmod 5]đč Ătape 4 â Ï (Chi)
Non-linĂ©aritĂ© : câest lâingrĂ©dient secret du mĂ©lange.
A'[x,y] = A[x,y] \oplus ((\neg A[x+1,y]) \land A[x+2,y])đč Ătape 5 â Îč (Iota)
Injection dâune constante de round RC[i] sur la lane (0,0).
A'[0,0] = A[0,0] \oplus RC[i]đ§ź Exemple pratique (SHA3-512)
import hashlib
data = b"SecuSlice - Keccak is love"
print("SHA3-256:", hashlib.sha3_256(data).hexdigest())
print("SHA3-512:", hashlib.sha3_512(data).hexdigest())
Résultat typique :
SHA3-256 = 7bdfec8a96be0da... (64 chars) SHA3-512 = 0b7154c6b91... (128 chars)
Note : contrairement Ă SHA-2, SHA-3 nâest pas plus lent dans la plupart des implĂ©mentations matĂ©rielles modernes.
Il offre aussi la famille SHAKE128/256, des versions extensibles (XOF) permettant de produire une sortie de longueur arbitraire.
đ§ Pourquoi câest une rĂ©volution
| Aspect | SHA-2 | SHA-3 |
|---|---|---|
| Structure | MerkleâDamgĂ„rd | Sponge |
| Attaques structurelles | Possibles (length extension) | Aucune connue |
| Résistance quantique | Moyenne | Supérieure |
| Diffusion | 2D | 3D sur 1600 bits |
| Vitesse (logicielle) | Haute | Bonne |
| Paramétrage | Fixe | Extensible (XOF) |
SHA-3 est un changement de philosophie :
- On ne compresse plus des blocs â on permutationne un espace.
- La sĂ©curitĂ© nâest plus un correctif â elle est intrinsĂšque Ă la conception.
Et surtout : les attaques connues contre MD/SHA-1/SHA-2 ne sâappliquent plus.
Aucune structure linéaire à casser, aucune extension de longueur possible, et une résistance bien plus élevée aux collisions différentielles.
đ§Ș Pour les amateurs de calculs (math beauty shot)
La permutation de Keccak-f[1600] sur un tour peut se condenser (pour les puristes) en une belle équation compacte :
A[x,y,z] = A[x,y,z] \oplus ((\neg A[x+1,y,z]) \land A[x+2,y,z]) \oplus RC[i] \oplus \text{ROTL}_{r[x,y]}(A[y,(2x+3y)\bmod5,z])Une alchimie de XOR, AND, rotations et symétries, réparties sur un cube de 1600 bits.
Un cauchemar Ă tracer Ă la main â un bonheur Ă modĂ©liser.
𧩠En résumé
- đ Conception innovante (sponge) â pas de vulnĂ©rabilitĂ© hĂ©ritĂ©e.
- đ§ź Structure simple â facile Ă implĂ©menter, difficile Ă casser.
- đ§ Solide base mathĂ©matique â permutations rĂ©versibles, diffusion totale.
- đ Modulaire â SHA3-224, -256, -384, -512, SHAKE128/256.
- đ„ Aucune collision connue, mĂȘme thĂ©orique.
En clair : SHA-3, câest le hash du futur â mais quâon nâutilise pas encore assez.
La plupart des systĂšmes restent sur SHA-256 âpar habitudeâ ou par âcompatibilitĂ© FIPSâ.
Mais ceux qui construisent les fondations du post-quantique, eux, ont déjà fait le saut.
đ§© Section finale â Comparaison, exercices & « pour jouer Ă la maison »
đŹ Tableau synthĂ©tique (rappel rapide)
| Propriété | MD5 | SHA-1 | SHA-2 (SHA-256 etc.) | SHA-3 (Keccak) |
|---|---|---|---|---|
| Taille digest | 128 bits | 160 bits | 224/256/384/512 bits | 224/256/384/512 (ou XOF) |
| Construction | MerkleâDamgĂ„rd | MerkleâDamgĂ„rd | MerkleâDamgĂ„rd | Sponge (Keccak-f[1600]) |
| Length-extension | Oui | Oui | Oui | Non |
| Collisions pratiques | Oui | Oui | Non connues | Non connues |
| Recommandé pour nouveaux designs | Non | Non | Oui | Oui |
| Famille XOF | Non | Non | Non | Oui (SHAKE128/256) |
đ§Ș Exercices / petits scripts Python (pratique maison)
Tous les scripts sont conçus pour tourner sur Python 3.8+. Ils utilisent la stdlib hashlib et hmac. Lance-les dans un terminal ; prends une biĂšre si tu veux â câest pĂ©dagogique, pas stressant.
1) Comparer empreintes et vitesse (MD5 / SHA-256 / SHA3-256)
# save as compare_hashes.py
import hashlib, timeit
data = b"SecuSlice: performance test" * 1024 # ~30 KB
algs = {
"md5": hashlib.md5,
"sha256": hashlib.sha256,
"sha3_256": hashlib.sha3_256
}
for name, ctor in algs.items():
def run():
ctor(data).digest()
t = timeit.timeit(run, number=2000)
print(f"{name:8} -> {len(ctor(data).digest())*8:3} bits, 2000 runs: {t:.4f}s")
Observation : MD5 est gĂ©nĂ©ralement le plus rapide en SW, SHA-3 proche de SHA-256 selon lâimplĂ©mentation et lâoptimisation CPU.
2) Montre la length-extension attack (concept) â et la bonne solution (HMAC)
Concept (MerkleâDamgĂ„rd) : si H = hash(secret || message), et que lâattaquant connaĂźt H et len(secret||message), il peut calculer hash(secret || message || pad || extra) sans connaĂźtre secret. DONC : ne pas faire mac = hash(secret || msg).
DĂ©monstration â mauvais MAC (conceptual):
# WARNING: ceci n'exploite pas réellement la longueur sans outil externe,
# mais illustre l'idée et montre l'alternative sûre (HMAC).
import hashlib, hmac
secret = b"supersecret"
msg = b"action=check"
# mauvais (à éviter)
bad_mac = hashlib.sha1(secret + msg).hexdigest()
print("bad_mac:", bad_mac)
# bon : HMAC (construit pour éviter length-extension)
good_mac = hmac.new(secret, msg, hashlib.sha256).hexdigest()
print("hmac_sha256:", good_mac)
Pour exploiter rĂ©ellement length-extension on utilise des outils comme hashpumpy â mais ici lâimportant est de comprendre : utilise HMAC.
3) Mesurer avalanche (flip 1 bit â regarder hachage)
import hashlib
m = bytearray(b"SecuSlice avalanche test")
m2 = m[:]
m2[0] ^= 0x01 # flip low bit
print("sha256(m) :", hashlib.sha256(m).hexdigest())
print("sha256(m2):", hashlib.sha256(m2).hexdigest())
Observation : une unique modification â empreintes complĂštement diffĂ©rentes (effet avalanche).
đ§ Petit exercice cryptographique (challenge rapide)
- Utilise le script
compare_hashes.pyen changeant la taille du buffer (* 1024â* 10240) et compare les temps. - ImplĂ©mente un micro-bench en multithread pour percevoir le scaling sur CPU multi-coeur (attention Ă GIL pour Python â utile pour discussion sur implĂ©mentations C vs hardware).
- Tente (sur une VM fermĂ©e / lab) dâutiliser
hashpumpypour voir une length-extension sur SHA-1 (rĂ©servĂ© au labo) â et observe pourquoiHMACte protĂšge.
đŒïž Flux textuel (MerkleâDamgĂ„rd vs Sponge) â prĂȘte Ă transformer en visuel
Titre visuel : MerkleâDamgĂ„rd vs Sponge â Pourquoi SHA-3 casse le moule
- MerkleâDamgĂ„rd (MD5, SHA-1, SHA-2)
- IcĂŽne : âïž
- Flux : Message â [Padding] â Bloc 512b â Compression f(state, block) â state â ⊠â Output
- Propriétés : itératif, vulnerable au length-extension, attaque possible sur structure linéaire.
- LĂ©gende : âOn empile, on compresse, on espĂšre que ça diffuse.â
- Sponge (SHA-3 / Keccak)
- IcĂŽne : đ§œ
- Flux : Message â XOR dans Rate (r bits) â Permutation Keccak-f â (rĂ©pĂ©ter) â Squeeze digest
- Propriétés : absorption + squeezing, pas de length-extension, permutation globale (1600 bits), XOF disponible (SHAKE).
- LĂ©gende : âOn absorbe, on secoue, on essore â plus de surprises structurelles.â
Utilise des flĂšches, couleurs distinctes (rouge = danger MD, vert = sĂ»r SHA-3) et place la table r + c = 1600 pour Keccak (ex : SHA3-256 â r=1088, c=512).
âïž MerkleâDamgĂ„rd (MD5, SHA-1, SHA-2)
Message â [ Padding ] â Bloc 512 bits â Compression f(state, block) â state â ⊠â Output
𧩠Propriétés
- Itératif
- Vulnérable au length-extension
- Attaques possibles sur la structure linéaire
đŹ Â«Â On empile, on compresse, on espĂšre que ça diffuse. »
đ§œ Sponge (SHA-3 / Keccak)
Message â XOR dans Rate (r bits) â Permutation Keccak-f[1600] â (rĂ©pĂ©ter) â Squeeze digest
𧩠Propriétés
- Absorption + Squeezing
- Pas de length-extension
- Permutation globale (1600 bits)
- XOF disponible (SHAKE)
đŹ Â«Â On absorbe, on secoue, on essore â plus de surprises structurelles. »
𧩠Conseils opérationnels (checklist SecuSlice)
- â Ne plus utiliser MD5/SHA-1 pour signatures, certificats, ou empreintes dâintĂ©gritĂ© critiques.
- â SHA-2 (SHA-256/512) : choix sĂ»r et largement supportĂ© â migrer les stacks legacy.
- â SHA-3 : adopter si tu veux rĂ©sistance structurelle et XOF (SHAKE) ; excellent pour designs nouveaux ou post-quantum-minded.
- đ Pour MACs utilisez HMAC (SHA-256/512) â Ă©vite toute construction
hash(secret||message). - đ§° Pour stockage de mots de passe : oublie SHA-* pur â utilise Argon2 / bcrypt / scrypt (KDF adaptĂ©s).
- đ Migration : prĂ©voir compatibilitĂ© ascendante, plan roll-out et réémission des certificats si nĂ©cessaire.
đ Pour aller plus loin (rĂ©fĂ©rences et lectures de fond)
- RFC 1321 â The MD5 Message-Digest Algorithm (Rivest, 1992).
- FIPS PUB 180-4 â Secure Hash Standard (SHS) (NIST) â spĂ©cifie SHA-1, SHA-2 family.
- FIPS PUB 202 â SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions (NIST, 2015).
- NIST SP 800-185 â SHA-3 Derived Functions: KMAC, TupleHash, etc.
- Bertoni, Daemen, Peeters & Van Assche â Keccak specifications and Keccak team papers (Keccak whitepaper).
- Wang, Yin & Yu â articles sur collisions MD/SHA family (2004 etc.).
- Stevens, Bursztein et al. â SHAttered collision (Google/CWI, 2017) â dĂ©monstration pratique pour SHA-1.
- HMAC original paper â Keyed-Hashing for Message Authentication (Krawczyk, Bellare, 1996).
- Bruce Schneier â Applied Cryptography (lecture historique et critique).
