🎂 MD5 et le paradoxe des anniversaires : quand ton gñteau cache des collisions

Ah, MD5. Dans les annĂ©es 90, c’était le chouchou de tout le monde. Rapide, compact, facile Ă  implĂ©menter, et surtout prĂ©sentĂ© comme « incassable ». Mais comme tout ado rebelle, il a vite montrĂ© ses failles. Aujourd’hui, l’utiliser pour la sĂ©curitĂ©, c’est comme confier ton mot de passe Wi-Fi au premier stagiaire qui passe : une trĂšs mauvaise idĂ©e.


📜 Un peu d’histoire : la gloire passĂ©e de MD5

MD5 (Message Digest 5) a Ă©tĂ© conçu en 1992 par Ronald Rivest (le « R » de RSA).
L’idĂ©e : produire une empreinte 128 bits d’un message, suffisamment unique pour garantir :

  • IntĂ©gritĂ© : toute modification du message change le hash.
  • UnicitĂ© : deux messages diffĂ©rents ne doivent pas donner la mĂȘme empreinte.

Et Ă  l’époque, 128 bits, ça semblait largement suffisant. AprĂšs tout, ça fait 2^{128} \approx 3,4 \times 10^{38} possibilitĂ©s. Spoiler : ça n’a pas tenu bien longtemps.


🎁 Le paradoxe des anniversaires : quand 23 personnes suffisent

Le cƓur du problĂšme se cache dans un paradoxe mathĂ©matique aussi cĂ©lĂšbre qu’élĂ©gant.

👉 Question : combien de personnes faut-il dans une salle pour qu’il y ait 50 % de chances que deux aient le mĂȘme anniversaire ?

RĂ©ponse surprenante : 23 personnes.

🔬 DĂ©monstration mathĂ©matique

On note :

  • n : le nombre de jours possibles (365 pour un calendrier).
  • k : le nombre de personnes.

La probabilitĂ© que tous les anniversaires soient distincts est :

P(\text{pas de collision}) = \prod_{i=0}^{k-1} \frac{n - i}{n}

Donc la probabilitĂ© qu’il y ait au moins une collision est :

P(\text{collision}) = 1 - \prod_{i=0}^{k-1} \frac{n - i}{n}

En posant n = 365, on trouve que :
P(\text{collision}) \approx 0,5 quand k \approx 23.


🔑 Application aux fonctions de hachage

Maintenant, appliquons ça aux empreintes MD5 :

  • MD5 → 128 bits
  • Nombre total de hashs possibles : 2^{128}

Le paradoxe des anniversaires nous dit que le nombre d’essais nĂ©cessaires pour obtenir une collision probable Ă  50 % est :

k \approx 1,177 \times \sqrt{2^{128}} = 1,177 \times 2^{64}

Soit environ 2^{64} essais → totalement impossible dans les annĂ©es 90
 mais avec les clusters GPU d’aujourd’hui, c’est faisable.


đŸ§© Mais ce n’est pas tout : les attaques diffĂ©rentielles

Le vrai coup de grĂące ne vient pas seulement du paradoxe. En 2004, la chercheuse chinoise Wang Xiaoyun a publiĂ© une mĂ©thode pour casser MD5 en moins d’une heure sur un PC classique. Pas besoin de faire 2^{64} essais, juste quelques millions suffisent.

Les chercheurs ont exploitĂ© la structure interne en rondes de MD5 (64 transformations Feistel-like).
En construisant des diffĂ©rentiels soigneusement choisis, ils ont pu gĂ©nĂ©rer deux messages diffĂ©rents avec le mĂȘme hash :

MD5(M_1) = MD5(M_2)

🚹 Des collisions dans le monde rĂ©el

MD5 est mort thĂ©oriquement, mais il a continuĂ© Ă  ĂȘtre utilisĂ© (mauvaise habitude). RĂ©sultat :

  • 2008 : une Ă©quipe gĂ©nĂšre un faux certificat SSL signĂ© avec MD5. RĂ©sultat : un navigateur acceptait un certificat pirate comme lĂ©gitime.
  • 2012 : le malware Flame utilisait une attaque sur MD5 pour se faire passer pour une mise Ă  jour Microsoft.
  • 2017 : Google publie SHAttered, une collision sur SHA-1
 mais le principe avait dĂ©jĂ  Ă©tĂ© validĂ© sur MD5 bien avant.

Bref : utiliser MD5, c’est comme laisser ta porte ouverte avec un panneau « ne pas entrer ».


📩 RĂ©sumĂ© pĂ©dagogique

✅ Ce qu’il faut retenir

  • MD5 produit des empreintes de 128 bits.
  • Le paradoxe des anniversaires rĂ©duit la sĂ©curitĂ© Ă  2^{64} opĂ©rations pour une collision.
  • Les attaques diffĂ©rentielles rendent MD5 encore plus faible.
  • Dans la vraie vie, MD5 a dĂ©jĂ  Ă©tĂ© exploitĂ© dans des attaques critiques.

❌ Ce qu’il ne faut pas faire

  • Ne jamais utiliser MD5 pour la sĂ©curitĂ© (mots de passe, certificats, signatures).
  • Ne pas se dire « c’est rapide, c’est pratique » → la sĂ©curitĂ©, ce n’est pas un sprint.

⚰ Conclusion sarcastique : MD5, le zombie de la crypto

MD5 est officiellement enterrĂ© depuis plus de 20 ans. Pourtant, on le croise encore dans certains logiciels, dans des bases de donnĂ©es poussiĂ©reuses, ou pire, pour « sĂ©curiser » des mots de passe. Autant dire que c’est comme utiliser un cadenas en plastique pour protĂ©ger une banque.

La leçon ? La cryptographie vieillit mal. Si tu veux faire du sĂ©rieux : SHA-256, SHA-3, BLAKE2, Argon2
 mais surtout pas MD5.


đŸ§Ș Exercice — MD5 & paradoxe des anniversaires (dĂ©monstration chiffrĂ©e)

🎯 Objectif

Montrer mathĂ©matiquement que pour une empreinte de n bits (ex. MD5 : n=128), le nombre d’essais pour obtenir une collision avec probabilitĂ© p est de l’ordre de \Theta(2^{n/2}) et calculer prĂ©cisĂ©ment la constante.


✍ Partie A — DĂ©monstration gĂ©nĂ©rale (papier-crayon)

A1) ProbabilitĂ© “zĂ©ro collision”

On hache k messages indépendants, uniformément sur N=2^n valeurs.
Montrer que la probabilitĂ© qu’il n’y ait aucune collision est :

P_0= \prod_{i=0}^{k-1} \frac{N-i}{N}= \exp!\left( \sum_{i=0}^{k-1} \ln!\left(1-\frac{i}{N}\right) \right).

Astuce : utiliser \ln(1-x)\approx -x-\frac{x^2}{2}-\dots et le fait que \sum_{i=0}^{k-1} i = \frac{k(k-1)}{2}.
En nĂ©gligeant les termes d’ordre supĂ©rieur lorsque k \ll \sqrt{N}, on obtient l’approximation classique :

P_0 ;\approx; \exp!\left(-\frac{k(k-1)}{2N}\right).

A2) Probabilité de collision

La probabilitĂ© d’avoir au moins une collision est :

P_{\text{coll}} ;=; 1 - P_0 ;\approx; 1 - \exp!\left(-\frac{k(k-1)}{2N}\right).

A3) Inversion : nombre d’essais pour une cible p

Poser P_{\text{coll}} = p (ex. p=0{,}5) et résoudre pour k :

\exp!\left(-\frac{k(k-1)}{2N}\right) = 1-p \quad\Rightarrow\quad \frac{k(k-1)}{2N} = -\ln(1-p).

Pour k grand, k(k-1)\approx k^2, donc :

k ;\approx; \sqrt{,2N,\ln!\frac{1}{1-p},},.

A4) Cas “50 % de chances” (la formule culte)

Avec p = 1/2 : \ln!\frac{1}{1-p}=\ln 2, d’oĂč :

k_{50} ;\approx; \sqrt{,2N\ln 2,} = \sqrt{,2\ln 2,};\sqrt{N} \approx 1{,}17741;\sqrt{N}.

Comme N=2^n, on obtient :

k_{50} ;\approx; 1{,}17741 \times 2^{n/2}.

👉 C’est LA constante qui justifie la rĂšgle empirique “sĂ©curitĂ© collision ≈ n/2 bits”.


🔱 Partie B — Applications numĂ©riques

B1) MD5 (n=128)

N = 2^{128},\quad k_{50} \approx 1{,}17741 \times 2^{64}\approx 2{,}17 \times 10^{19}.

RĂ©sultat : â‰ˆ 2^{64} essais (Ă  la constante prĂšs).
Historiquement “astronomique”, mais les attaques diffĂ©rentielles ont fait bien pire que ça (beaucoup moins d’essais en pratique).

B2) SHA-256 collision (repĂšre)

n=256 \Rightarrow k_{50} \approx 1{,}17741 \times 2^{128},

inatteignable dans tout horizon raisonnable.

B3) Variantes Ă  calculer (exercice rapide)

Calcule k_{50} pour :

  • n=64 : k_{50} \approx 1{,}17741 \times 2^{32}
  • n=96 : k_{50} \approx 1{,}17741 \times 2^{48}

(Donne les valeurs dĂ©cimales pour t’entraĂźner.)


🎯 Partie C — “Dans l’autre sens” : probabilitĂ© aprĂšs un budget d’essais

On veut P_{\text{coll}} aprĂšs k essais :

P_{\text{coll}}(k) \approx 1 - \exp!\left(-\frac{k(k-1)}{2\cdot 2^n}\right).

C1) Exemple (Ă  faire)

Pour n=64 et k=10^9 hachages, calcule :

\lambda = \frac{k(k-1)}{2\cdot 2^{64}}\approx \frac{(10^9)^2}{2\cdot 2^{64}}= \frac{10^{18}} {2\cdot1{,}8446744\times 10^{19}}\approx 0{,}0271,

puis

P_{\text{coll}} \approx 1 - e^{-\lambda} \approx 1 - e^{-0{,}0271} \approx 2{,}67%.

🧠 Partie D — “Pourquoi la constante 1,17741 ?”

Elle vient de \sqrt{2\ln 2} lorsque p=1/2.
Plus généralement, pour une cible p, la constante multiplicative est \sqrt{2\ln\frac{1}{1-p}}.


🧰 Partie E — EncadrĂ© “bonnes pratiques”

  • Collision resistance d’une empreinte n bits ≈ n/2 bits effectifs (Ă  cause du paradoxe).
  • Pour signer/identifier : SHA-256 (ou plus), SHA-3BLAKE2/3.
  • MD5 : Ă  bannir (attaques diffĂ©rentielles + collisions pratiques).

✅ CorrigĂ© synthĂ©tique

  • P_0 \approx \exp!\left(-\dfrac{k(k-1)}{2\cdot 2^n}\right)
  • P_{\text{coll}} \approx 1 - \exp!\left(-\dfrac{k(k-1)}{2\cdot 2^n}\right)
  • k_p \approx \sqrt{,2^{n+1},\ln!\dfrac{1}{1-p},}
  • Cas 50 % : k_{50} \approx 1{,}17741 \times 2^{n/2}
  • MD5 : k_{50} \approx 1{,}17741 \times 2^{64} \approx 2{,}17\times 10^{19}

đŸ’» (Optionnel) Mini-simu Ă  coder plus tard

  • Tire des entiers uniformes dans [0,2^n), insĂšre-les dans un set, et arrĂȘte quand tu vois la premiĂšre collision.
  • RĂ©pĂšte l’expĂ©rience (ex. 1000 fois), moyenne le k observĂ© → compare Ă  1{,}17741\times 2^{n/2}.
  • Fais-le pour n=24 ou n=28 pour obtenir des rĂ©sultats en quelques secondes.
🎂 MD5 et le paradoxe des anniversaires : quand ton gñteau cache des collisions
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