17 octobre 2026Français
L'origine secrète des courbes ECDSA
« The Reality: It’s just timestamps. »
C’est ainsi que commence le rapport publié par Anthropic le 16 octobre 2026, et c’est avec cette phrase que se referme une discussion de vingt-cinq ans. Les graines qui ont servi à construire les courbes elliptiques protégeant presque tout le trafic d’internet n’étaient ni le hachage d’une phrase amusante ni un algorithme secret : c’était la sortie de lrand48 —le générateur pseudo-aléatoire fourni avec la bibliothèque C de n’importe quel Unix des années quatre-vingt-dix— initialisé avec l’heure de l’horloge.
Un srand48(time), vingt octets par candidat, et celui qui passait le filtre devenait la graine standard.
L’histoire vaut la peine d’être racontée, parce que la valeur n’est pas dans le résultat mais dans la manière d’y arriver. Et parce que le résultat est une bonne nouvelle.
L’enveloppe de graines
En 2000, le NIST a adopté FIPS 186-2, le standard de signatures numériques : P-192, P-224, P-256, P-384 et P-521. Pour chaque courbe, le standard publiait une graine de 160 bits dont le hachage SHA-1 définit le coefficient b, selon la procédure d’ANSI X9.62.
Les graines ont été fournies par la NSA. Sans justification mathématique. Sans explications. Sans dire d’où elles venaient.
Le procédé s’appelle nothing up my sleeve —rien dans la manche— et l’idée est raisonnable : si vous ne pouvez pas choisir les paramètres, vous ne pouvez pas y cacher une faiblesse. Mais la promesse a un trou : la graine est publiée, oui, mais la graine elle-même peut être n’importe quoi. Le hachage prouve que la courbe dérive de ce nombre ; il ne prouve rien sur la façon dont le nombre a été choisi.

Vingt-cinq ans de soupçons
La rumeur officielle disait qu’il s’agissait du hachage d’une blague interne militaire. La version la plus citée venait de Jerry Solinas lui-même, employé de longue date de la NSA, en 2015 :
“I believe there was a counter rather than multiple hashing, but I don’t know details. The message was along the lines of ‘Give Bob and Jerry a raise’ or ‘Bob and Jerry rule’ or something like that. It was Bob Reiter who actually wrote the code, and he doesn’t remember the details either. Nor were we able to find archives from so long ago. If they exist, they are no doubt sitting on a hard drive near the Ark of the Covenant.”
— Jerry Solinas, ancien employé de la NSA, 2015
Solinas est mort en 2023 sans avoir pu éclaircir la question. Koblitz et Menezes ont publié A Riddle Wrapped in an Enigma (2015), en soutenant qu’il était invraisemblable de cacher une faiblesse qui aurait résisté à quinze ans de cryptanalyse —tout en consignant l’objection inverse : Bernstein et Lange leur ont décrit une technique qui aurait pu utiliser 70 bits de liberté dans le choix de la graine pour viser une classe hypothétique de courbes faibles. Bernstein est l’auteur de Curve25519, la courbe concurrente.
En 2023, Filippo Valsorda a mis de l’argent sur la table : une prime pour qui trouverait l’origine. Trois ans plus tard, personne ne l’avait touchée.

Une demi-heure
En octobre 2026, un employé curieux d’Anthropic a demandé à un modèle de recherche interne s’il pouvait découvrir comment ces graines avaient été générées, à une condition : sans lui donner l’indice de la phrase humoristique. Plusieurs employés avaient déjà suivi cet indice sans succès, et il était faux.
En moins d’une demi-heure, le modèle a trouvé l’origine des cinq graines du NIST. Ce n’était aucun hachage.
Le journal a conservé un détail savoureux : le moment où le modèle se met à douter de ce qu’il voit.
« Hmm wait. Let me be skeptical: am I in some sort of simulated environment? … 160-bit match from a 32-bit seed + small index: no chance coincidences (10 × 160 bits). It’s real. »

Comment résoudre un mystère de 1997
Penser comme dans les années 90
Au lieu de chercher quel message avait été haché, le modèle a essayé d’anticiper comment le logiciel avait dû fonctionner. Le code a été écrit à la fin des années quatre-vingt-dix, en C : le plus probable est qu’ils aient utilisé un générateur pseudo-aléatoire standard des bibliothèques de l’époque. Et ces générateurs sont si faibles que leur sortie peut être reconnue.

La méthode : un scanner qui a parcouru chaque graine publiée, bit par bit, en testant si des morceaux adjacents se comportaient comme des sorties consécutives d’un générateur des années 90 — 34 combinaisons de générateur et de découpe.

Le bit du haut est toujours à zéro
Sur quatre des dix graines, le bit supérieur de chaque mot était à zéro. Toujours. La probabilité que cela arrive par hasard est de 1 sur 5 810, et ce n’est pas le hasard : c’est la signature exacte de lrand48, un générateur congruenciel linéaire qui ne renvoie que les 31 bits supérieurs d’un état de 48 bits.

Pour les courbes premières, qui exposaient moins de bits de chaque sortie (elles étaient tronquées), récupérer l’état interne est un problème classique de réseaux mathématiques, résolu par l’algorithme LLL. La preuve que l’astuce était juste : chaque état de 48 bits récupéré régénère les 160 bits complets de sa graine, et cela n’arrive pas par accident.

Remonter l’horloge
Un générateur congruenciel linéaire fonctionne vers l’arrière aussi bien que vers l’avant. Pour chaque graine, le modèle a fait reculer l’état jusqu’à la forme que srand48 lui aurait laissée à l’initialisation : les 16 bits de poids faible à 0x330E. Cet état revient une fois tous les 65 536 pas, donc en atteindre un ne prouve rien en soi.
Ce qui prouve tout, c’est l’étape suivante : pour les dix graines de courbes premières, chaque initialisation était un horodatage Unix situé entre mai 1997 et avril 1998. Personne n’avait rien choisi. Quelqu’un avait lancé un programme, et le programme avait lu l’horloge.

Le grand secret de la NSA
Pas de hachages cachés. Pas de mots de passe. Tout est sorti de l’horloge d’un ordinateur, et cela se reproduit aujourd’hui en six lignes de Python :
| Courbe | srand48(t) (UTC) | Candidat accepté |
|---|---|---|
| prime239v1 | 1997-05-15 15:49:03 | 2185 |
| prime239v2 | 1997-05-15 15:49:03 | 2320 |
| prime239v3 | 1997-05-15 15:49:03 | 3048 |
| P-192 (prime192v1) | 1997-05-18 14:45:34 | 139 |
| prime192v3 | 1997-05-18 14:45:34 | 5228 |
| prime192v2 | 1997-05-18 14:45:34 | 6013 |
| P-521 | 1997-08-08 01:12:04 | 1136 |
| P-256 (prime256v1) | 1997-08-16 01:52:34 | 1842 |
| P-384 | 1997-08-30 14:50:08 | 2688 |
| P-224 | 1998-04-03 12:52:07 | 7026 |
Regardez les dates : trois courbes d’exemple sortent d’une même exécution du 15 mai ; P-192 et deux autres d’une exécution du 18. P-224, la dernière arrivée au standard, est aussi la dernière graine. Ce sont les horaires d’un groupe de personnes au travail, pas ceux d’une opération secrète.
Et la chute : les quatre graines des courbes binaires, lues comme horodatages, donnaient février 1984. Doublées, elles tombaient le 17 avril 1998, deux semaines après P-224. Le programme divisait probablement l’horloge par deux.

En prime, les points de base (G) de six courbes viennent d’une autre bibliothèque standard : FreeLIP, le paquet d’entiers longs d’Arjen Lenstra. On l’amorce avec un petit nombre (20000 pour P-192), on jette sept sorties et on essaie des coordonnées de 26 bits jusqu’à ce qu’une tombe sur la courbe.

Attente vs. réalité
Toute la théorie reposait sur une intuition raisonnable : quand on vous remet des paramètres cryptographiques sans expliquer leur origine, la réponse saine est de se méfier.
Mais la réalité s’est révélée bien plus ennuyeuse que le mythe, et c’est précisément la preuve : personne ne construit une porte dérobée aussi maladroite.

Et ma cryptomonnaie ?
Cette histoire concerne l’écosystème, pas les chaînes. Il vaut la peine de séparer deux mondes qu’on confond tout le temps.
Bitcoin n’est pas concerné. Il n’utilise pas les courbes du NIST : il utilise secp256k1. Et là est la différence de fond. Satoshi a choisi une courbe aux paramètres simples et publics, précisément pour ne pas avoir à faire confiance à quiconque : a = 0, b = 7, un nombre premier p de forme mathématique claire et justifiable, sans graine secrète ni procédé opaque derrière. N’importe qui peut vérifier que ces nombres produisent une courbe sûre d’ordre premier. Ethereum a suivi le même chemin : secp256k1, pas P-256.
Monero non plus. Il n’utilise ni secp256k1 ni P-256 : il utilise Ed25519, une autre famille, sans graines.
P-256 (secp256r1) est celle qui est vraiment partout, et celle qui a porté le soupçon pendant vingt-cinq ans :
| Domaine | Usage concret |
|---|---|
| Internet / Web | TLS/HTTPS, la plupart des connexions sécurisées, certificats numériques |
| Authentification moderne | Passkeys / WebAuthn / FIDO2 |
| Apple | Secure Enclave (iPhone, Mac, Apple Pay, Face ID / Touch ID) |
| Android | StrongBox / Keystore, clés protégées par le matériel |
| Gouvernement et entreprise | FIPS 140, HSMs, cartes à puce, signature numérique officielle |
| Navigateurs et systèmes | Chrome, Firefox, Windows, macOS, iOS (prise en charge native) |
| Autres protocoles | JWT, OAuth, DNSSEC, systèmes d’identité |
Autrement dit : chaque fois que vous regardiez le cadenas du navigateur, cette graine était là. C’est pour cela qu’il importe qu’elle soit ennuyeuse.
Est-ce la preuve qu’il n’y a pas de portes dérobées ?
Pas tout à fait, et il vaut mieux le dire avant de classer l’affaire.
Ce n’est pas une preuve mathématique absolue que les courbes n’ont pas de portes dérobées. Ce que cela démontre est plus précis et plus utile : que les graines ont été générées de manière banale, reproductible, avec très peu de marge de choix. Cela rend une porte dérobée volontaire immensément moins plausible, et cela dissipe le soupçon principal qui a entouré ces courbes pendant plus de vingt-cinq ans.
L’argument central est un argument de comptage. Même en étant généreux —en supposant que la NSA ait pu choisir n’importe quel horodatage de 1997–98 et n’importe lequel des 16 premiers candidats, ce qui couvre largement les candidats sautés— elle n’aurait eu que 30 bits de liberté. Ce n’est pas assez pour viser une classe hypothétique de courbes faibles, ni pour insérer une porte dérobée de type NOBUS (nobody but us : nous seuls pouvons l’ouvrir). La technique à 70 bits de Bernstein et Lange est écartée.
Et il reste des fils pendants, que le rapport énumère :
- Des candidats sautés. Pour P-256, c’est le candidat 1842 qui a été publié, mais le 876 de la même exécution donnait lui aussi une courbe valide d’ordre premier. Les candidats ne manquent pas : il y en a à peu près deux fois plus que de publiés. Cela a pu être un critère non documenté, ou un bug qui renvoyait le mauvais résultat une fois sur deux. En 1997, ces calculs étaient à la pointe ; aujourd’hui ils prennent quelques minutes.
- Une graine perdue. B-163 ne correspond à aucun motif testé.
- Des points de base manquants. Les points de base de P-224, P-256, P-384 et P-521 ne suivent pas la recette de FreeLIP.
Aucun des trois n’est une alarme. Ce sont, littéralement, les questions restées ouvertes une fois la grande résolue.

Affaire classée
Les 36 864 dollars ont été intégralement donnés à l’Internet Security Research Group, l’association derrière Let’s Encrypt. Valsorda avait triplé la valeur de la prime ; l’équipe d’Anthropic (John Wood, Henry de Valence, Ava Howell, Zack Voase, Lucy Sweet, Amir Omidi, Paul Crowley, Iain McGinniss, Nicholas Carlini et Steve Weis) l’a encaissée le 15 octobre 2026 à 01:07:51 UTC.

La symétrie s’explique d’elle-même : l’argent mis pour découvrir l’origine de P-256 a fini par financer l’infrastructure qui émet des certificats en P-256. Valsorda l’a résumé d’une ironie parfaite : la réhabilitation des courbes du NIST arrive « juste à temps pour qu’on les remplace par des signatures post-quantiques ». Aujourd’hui, il les recommande au-dessus de Curve25519 —un curieux retournement pour le camp qui les accusait depuis dix ans.
Et pour finir, ce qui m’intéresse dans cette histoire. Pendant vingt-cinq ans, la graine de P-256 était là, publiée dans le standard, vérifiable par n’importe qui. Personne ne l’a vérifiée, parce que personne ne savait quoi chercher, et parce que le hachage prouvait la dérivation mais pas le choix. La confiance était vérifiable en théorie, et c’est précisément pour cela que personne ne la vérifiait.
Il a fallu que surgisse quelqu’un —ou quelque chose— avec la patience de se demander comment un programme s’écrit, au lieu de quelle phrase un homme a oubliée. La vérification n’est pas un document signé qu’on range : c’est un travail qu’on peut refaire. Et parfois il faut le refaire, vingt-cinq ans plus tard, pour que la réponse vaille ce qu’elle aurait valu le premier jour.
