Contexte technique

Le standard ECDSA, adopté par le NIST en 2000 (FIPS 186‑2), comprend plusieurs courbes (P‑192, P‑224, P‑256, P‑384, P‑521). Chaque courbe possède un paramètre seed de 20 octets, utilisé pour calculer le coefficient b de la courbe. Les valeurs de ces seeds ont toujours été publiées sans justification, ce qui a alimenté des doutes sur d’éventuels backdoors.

Méthodologie de Claude

En octobre 2026, Claude a interrogé un modèle interne pour reproduire les seeds sans indice explicite. Le modèle a supposé que le code de génération utilisait le générateur linéaire congruentiel lrand48 des bibliothèques C des années 1990, initialisé par un Unix timestamp. Claude a donc écrit un scanner qui décale chaque seed d’un bit et teste la correspondance avec les sorties consécutives de lrand48. Le scan a couvert 34 combinaisons de générateur et de tranche d’octets.

#include <stdlib.h>
srand48(timestamp);
for (int i=0;i<n;i++) {
    unsigned long long out = lrand48(); // 48‑bit state, top 31 bits returned
    // extract 20 bytes per iteration
}

Le scanner a détecté que, sur les dix seeds étudiés, les bits supérieurs étaient systématiquement nuls, un motif qui apparaît avec une probabilité de 1/5810 et indique clairement lrand48, qui ne renvoie que les 31 bits supérieurs d’un état de 48 bits.

Analyse des résultats

Pour les courbes à champ premier, Claude a récupéré l’état complet du PRNG à partir des bits tronqués. La récupération d’un LCG tronqué se résout par un problème de réseau, traité avec l’algorithme LLL (Lenstra‑Lenstra‑Lovász). En testant chaque fenêtre possible, il a constaté que les cinq seeds NIST et cinq seeds du standard ANSI X9.62 correspondaient à lrand48() >> 23, c’est‑à‑dire les 31 bits supérieurs de chaque sortie.

En remontant l’état du générateur jusqu’à la forme srand48(state) où les 16 bits faibles valent 0x330E, Claude a trouvé que chaque initialisation correspondait à un timestamp Unix compris entre mai 1997 et avril 1998 pour les courbes à champ premier, et à février 1984 pour les courbes à champ binaire. En doublant ces timestamps, les valeurs binaire‑courbe se situent le 17 avril 1998, deux semaines après la génération de P‑224, ce qui suggère un éventuel facteur de division du temps dans le code.

Implications pour la confiance

Les seeds n’ont pas été dérivés d’une fonction de hachage cryptographique ni d’une source secrète. Ils proviennent d’un PRNG faible, initialisé uniquement par l’horloge système. Cette découverte ne constitue pas une faille cryptographique : les paramètres de courbe restent conformes aux exigences de sécurité du NIST. Au contraire, le fait que la génération soit reproductible à partir d’un timestamp public réduit la suspicion d’une manipulation intentionnelle.

Le travail montre toutefois les limites de la transparence historique : sans documentation, même des standards largement adoptés peuvent rester opaques pendant des décennies. La méthode de Claude, combinant analyse de bits, recherche de motifs LCG et résolution LLL, fournit un modèle pour examiner d’autres paramètres cryptographiques dont l’origine reste incertaine.