đŸȘž Fonctions de hachage : MD5 est mort, vive SHA-3 !

đŸș 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 :

h : {0,1}^* \to {0,1}^n

Elle doit respecter trois propriétés essentielles :

  1. RĂ©sistance aux collisions : il doit ĂȘtre difficile de trouver deux messages distincts m1,m2​ tels que h(m1)=h(m2).
  2. Résistance à la préimage : impossible de retrouver mm à partir de h(m).
  3. 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érationNomAnnéeStructureStatut
1ïžâƒŁMD51992Merkle–DamgĂ„rdCassĂ©
2ïžâƒŁSHA-11995Merkle–DamgĂ„rdCassĂ© (collisions pratiques)
3ïžâƒŁSHA-22001Merkle–DamgĂ„rd amĂ©liorĂ©SĂ©curisĂ©
4ïžâƒŁSHA-3 (Keccak)2015Sponge constructionSĂ©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 :

  1. On découpe le message en blocs de 512 bits.
  2. On complĂšte le dernier bloc avec un padding spĂ©cifique : un bit 1, puis des 0, puis la longueur du message sur 64 bits.
  3. 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 2004Wang 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 < 64

Soit 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 :

  1. 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.
  2. 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 :

\iota \circ \chi \circ \pi \circ \rho \circ \theta

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

AspectSHA-2SHA-3
StructureMerkle–DamgĂ„rdSponge
Attaques structurellesPossibles (length extension)Aucune connue
Résistance quantiqueMoyenneSupérieure
Diffusion2D3D sur 1600 bits
Vitesse (logicielle)HauteBonne
ParamétrageFixeExtensible (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éMD5SHA-1SHA-2 (SHA-256 etc.)SHA-3 (Keccak)
Taille digest128 bits160 bits224/256/384/512 bits224/256/384/512 (ou XOF)
ConstructionMerkle–DamgĂ„rdMerkle–DamgĂ„rdMerkle–DamgĂ„rdSponge (Keccak-f[1600])
Length-extensionOuiOuiOuiNon
Collisions pratiquesOuiOuiNon connuesNon connues
Recommandé pour nouveaux designsNonNonOuiOui
Famille XOFNonNonNonOui (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)

  1. Utilise le script compare_hashes.py en changeant la taille du buffer (* 1024 â†’ * 10240) et compare les temps.
  2. 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).
  3. Tente (sur une VM fermĂ©e / lab) d’utiliser hashpumpy pour voir une length-extension sur SHA-1 (rĂ©servĂ© au labo) — et observe pourquoi HMAC te 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).
đŸȘž Fonctions de hachage : MD5 est mort, vive SHA-3 !
Partager cet article : Twitter LinkedIn WhatsApp

đŸ–‹ïž PubliĂ© sur SecuSlice.com

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut