Anthropic: Claude traced the NIST elliptic-curve seeds in half an hour — not hashes, just lrand48 plus 1997 Unix timestamps
A question that has hung around for more than two decades: where did the seed parameters of NIST's elliptic curves come from? The NSA supplied them without explanation. Some guessed a hash of a joke phrase; others suspected something worse. Anthropic says it let an AI take a run at it and got an answer in half an hour — output from a C library random-number generator on some 1997 machine, seeded with the Unix timestamp of the moment.
Start with the problem itself. ECDSA is the most widely used elliptic-curve cryptography standard, adopted by NIST in 2000 as part of the FIPS 186-2 Digital Signature Standard. For curves over prime and binary fields, the specification publishes a 'seed' parameter whose hash defines the curve's coefficient b. The trouble is provenance: the seeds were provided by the NSA with no explanation or justification. NIST P-256's seed, for instance, is C49D3608 86E70493 6A6678E1 139D26B7 819F7E90, and nobody knew where it came from. Koblitz and Menezes wrote a survey, 'A Riddle Wrapped in an Enigma', devoted to the controversy.
The most popular story was 'a hash of a humorous passphrase'. Jerry Solinas, a longtime NSA employee, said in 2015 that he believed a counter rather than repeated hashing was used, that the message was along the lines of 'Give Bob and Jerry a raise' or 'Bob and Jerry rule', that Bob Reiter actually wrote the code, and that Reiter did not remember the details either. Solinas died in 2023 and colleagues from that period did not respond, so the trail went cold. Anthropic says several employees chased that theory without success — it turned out to be wrong.
The real answer is about method. Anthropic writes that in October 2026 a curious employee asked an internal research model whether it could figure out how the seeds were generated without any hints. In under half an hour, Claude found the origins of the P-192, P-224, P-256, P-384 and P-521 seeds — none of them the output of any hash algorithm, but of the C library's lrand48 generator seeded with a Unix timestamp. The mechanism: initialise the generator with timestamp t, draw 20 bytes per round as a candidate seed, so the first 20 bytes are candidate one, the next 20 candidate two, and so on. P-256 needed 1,842 iterations to produce the standardised seed.
How it was found is more interesting than the answer. Searching for hashes of joke phrases found nothing, so Claude changed angle: assume the software that generated the curves used a pseudorandom generator shipped with 1990s C libraries. Those old generators are weak enough that their output can be recognised, and recognising it can reveal the initial state. It wrote a scanner that slid along each published seed one bit at a time, testing whether adjacent chunks were consecutive outputs of a 1990s-vintage generator across 34 combinations of generator and output slice. Then it noticed a pattern in the top bits: written as five 32-bit words, four of the ten seeds have a zero in the top bit across all 20 words, which would happen by chance with probability 1/5,810. That is the signature of the linear congruential generator lrand48, which returns only the top 31 bits of a 48-bit state. The state was recovered by taking the first word, trying all 2^17 values of the 17 hidden bits and checking whether the next four words followed — it worked for all four seeds.
The prime-field seeds came from the same generator but kept fewer bits of each output, so the internal state had to be recovered from truncated output. Anthropic says that is a textbook lattice problem, solved with the Lenstra–Lenstra–Lovász (LLL) basis-reduction algorithm. Because it did not know which bits of the state the seeds might expose, the model ran the solver over every window. All five NIST prime-curve seeds plus five more from ANSI X9.62 showed the same pattern: lrand48() >> 23, and each recovered 48-bit state regenerates all 160 bits of its seed, which does not happen by chance. The timeline fell out too: every srand48 initialisation for the ten prime seeds was a Unix timestamp between May 1997 and April 1998, while the four binary-curve initialisations read as February 1984 and, with the timestamps doubled, map to April 17, 1998 — two weeks after the P-224 run, suggesting the program may have halved the clock.
State the conclusion the way the original does, without inflating it. Anthropic says plainly: this is not a cryptographic break, not a new attack, not a weakness in the curves; if anything it makes it more plausible that the curves were chosen without backdoors or deliberate weaknesses. People distrusted the NIST parameters because they arrived without any account of how they were chosen. It now looks like the seeds were generated in a very simple way — a common pseudorandom generator initialised from the clock, reproducible by anyone — which leaves far less room for subversion. The page also says outright that readers should treat this as a fun closing chapter, with no action to take and nothing to do differently.
The boundaries need stating too. First, this is Anthropic's own account, including the 'under half an hour' timing claim, with no third-party reproduction log; however, they published reproducible code under CC0, including a script that regenerates the ten prime-field and four binary-field seeds and code that generates base-point x coordinates via LIP's zrandom and checks them against the published points, which makes the result independently testable. Second, gaps remain: the fifth binary seed, B-163, fits nothing tried and is still unexplained, and nobody knows how the base points for P-224, P-256, P-384 and P-521 were generated, or those of the NIST binary curves. Third, the original notes that some candidates were skipped: P-256's candidate 876 also yields a prime-order curve with parameters chosen the same way, the P-224 run passed over three such curves, and the two runs behind the ANSI X9.62 examples passed over seven more, with the selection criteria unknown. Anthropic's judgement is that so few candidates were skipped that selecting weakened curves is implausible, but no definitive answer is offered. Fourth, none of this changes anyone's security configuration; it is not a reason to touch your TLS settings.
🤔 Frequently Asked Questions
Does this mean the cryptography is broken?
No. Anthropic states it is not a break, not a new attack and not a weakness; it actually lowers the plausibility of deliberately weakened curves. No action is needed.
What is the actual origin of the seeds?
Output of the C library's lrand48 generator initialised with a Unix timestamp, drawing 20 bytes per candidate. P-256's seed is candidate 1,842, with an initialisation timestamp in August 1997.
What remains unexplained?
Yes. The fifth binary seed B-163 matches nothing tried; how the base points of P-224/256/384/521 and the NIST binary curves were generated is unknown; and why some viable candidates were skipped is unexplained.
Can I verify it myself?
Yes. Anthropic published CC0 reproduction code on the page, including scripts that recompute seeds from timestamps and iteration counts and that generate base points via LIP zrandom and compare them with the published Gx.
🛠️ Recommended Tools
- Timestamp Converter Unix timestamps are the heart of this: convert those 1997 epoch seconds back and forth and you can check the table yourself.
- Hash Generator The old theory was a hash of a joke phrase; run a few algorithms yourself and you can see why that trail was a dead end.
- Base64 Encoder Seeds, base points and curve parameters show up in certificates and docs as hex or Base64, so converting between them is routine parameter work.
- Regex Tester Pulling seeds and coordinates out of headers or logs in bulk is regex work; tune the pattern in a tester before running it over everything.
- Local LLM Runner The method here is scanner plus brute force plus lattice reduction; running a local model alongside scripts keeps that kind of work under your control.
Summary
Anthropic's Frontier Red Team published research in October 2026: an internal research model, Claude, worked out in under half an hour where the seed parameters of NIST curves P-192, P-224, P-256, P-384 and P-521 came from. Not the output of any hash, but of the C library's lrand48 generator initialised with a Unix timestamp, drawing 20 bytes per candidate; P-256's seed is candidate 1,842, with initialisation times between May 1997 and April 1998. The method turned away from the failed joke-phrase-hash theory: assume a 1990s C library PRNG, write a scanner across 34 generator and slice combinations, and identify lrand48 by the 1-in-5,810 signature of all-zero top bits across 20 words; four binary seeds were recovered by trying all 2^17 hidden bits, and the ten prime seeds including five from ANSI X9.62 by LLL lattice reduction on truncated output, all matching lrand48() >> 23. Anthropic stresses this is not a cryptographic break, makes a deliberate backdoor less plausible and requires no action; CC0 reproduction code is published on the page. Boundaries: the account is Anthropic's own and the half-hour timing has no third-party log; the B-163 seed, the base-point generation for these curves, and why some viable candidates were skipped remain unexplained. Everything here comes from the sources below with no speculation added.
Sources: Anthropic 官方研究页:Claude reveals ECDSA curve origins(含 CC0 复现代码)
NIST FIPS 186-2 原文(曲线与种子参数的规范文档)
Koblitz & Menezes《A Riddle Wrapped in an Enigma》(种子争议综述)
lrand48 手册页(只返回 48 位状态的高 31 位)