10月16日、Anthropicが「Claude reveals ECDSA curve origins」と題した記事を公開した。この記事では、ClaudeがNIST標準のECDSA楕円曲線パラメータの起源を25年越しで解明したこと、およびその解析プロセスについて詳しく紹介されている。
TLSやSSH、コード署名など現代のインターネットセキュリティを支えるECDSA(Elliptic Curve Digital Signature Algorithm)には、NISTが2000年に標準化した際から「出所不明のシード値」が付随していた。NSAがそのシードを「説明なし」で提供したことから、暗号コミュニティでは「意図的なバックドアが仕込まれているのではないか」という疑念が20年以上くすぶり続けてきた。2013年のスノーデン事件でNSAによる盗聴工作が明るみに出て以降、その疑念はさらに根深くなっていた。その謎をAIが30分足らずで解いてしまったのが今回の話だ。
20年以上くすぶり続けた疑念
NISTがFIPS 186-2で標準化したP-256やP-384といった楕円曲線には、曲線パラメータの乱数性を担保するための「シード値」が付随している。たとえばP-256のシードは以下のとおりだ。
SEED = C49D3608 86E70493 6A6678E1 139D26B7 819F7E90
この値がどのように生成されたか、NISTもNSAも説明を一切行わなかった。暗号の世界では「verifiably random(検証可能な乱数)」として提示されながらも、その検証手段がない状態が続いた。Neal KoblitzとAlfred Menezeが2015年に論文でこの問題を整理し、懸賞金($36,864)も設けられたが、誰も解を見つけられなかった。
NSA職員だったJerry Solinasは「『Give Bob and Jerry a raise』みたいなフレーズをハッシュしたと思う」と証言していたが、本人が2023年に亡くなり、真相は永久に失われるかに見えた。
Claudeが30分未満で解明した
2026年10月、Anthropicの社員がヒントを与えずに社内研究モデルに「このシード値はどうやって生成されたか?」と問いかけた。30分も経たないうちに、ClaudeはNIST P-192、P-224、P-256、P-384、P-521すべてのシードの起源を特定した。
答えはシンプルなものだった。ハッシュ関数ではなく、C標準ライブラリのlrand48(線形合同法の擬似乱数生成器)をUnixタイムスタンプで初期化して生成した乱数列だった。lrand48は1990年代のUnix環境では広く使われていた標準的なPRNG(擬似乱数生成器)で、当時の開発者が手軽に乱数を得るために使う汎用ツールだった。
アルゴリズムの骨格はこうだ。
srand48(unix_timestamp)で乱数生成器を初期化- 1回の反復で20バイトの候補シードを生成
- 有効な曲線が得られるまで繰り返す
P-256の場合、1842回目の反復で標準化されたシードが出てきた。以下はその再現コードだ(元記事より引用)。
from datetime import datetime, timezone
def unix(when):
return int(datetime.fromisoformat(when).replace(tzinfo=timezone.utc).timestamp())
def candidate(t, n, per, shift, width):
# srand48(t) が設定する48ビット内部状態を模倣
x, out = (t << 16) | 0x330E, ""
for i in range(per * n):
x = (0x5DEECE66D * x + 0xB) % 2**48 # lrand48 の1ステップ
if i >= per * (n - 1):
out += "%0*X" % (width, x >> shift)
return out
# P-256: 1997年8月16日 01:52:34 UTC、1842回目の候補
print(candidate(unix("1997-08-16 01:52:34"), 1842, 20, 40, 2))
# → C49D360886E704936A6678E1139D26B7819F7E90 ← 実際のシードと一致
タイムスタンプを見ると、プライム曲線のシードはすべて1997年5月〜1998年4月の間に生成されていた。
なぜ25年間見つからなかったのか
Claudeが取ったアプローチの特徴は、「ハッシュかもしれない」という先入観を捨て、「1990年代のCライブラリが使いそうなPRNGの出力を探す」という視点で解析した点だ。
lrand48は48ビット状態の上位31ビットしか返さない(下位17ビットは捨てられる)。この特性により、シード値の各32ビットワードの最上位ビットがすべて0になるという統計的シグネチャが現れる。10個のシードのうち4個でこのパターンが揃う確率は約1/5810であり、偶然ではない。
状態の復元には、切り詰められた線形合同法発生器に対する教科書的な手法である**LLL(Lenstra–Lenstra–Lovász)格子基底簡約アルゴリズム**を適用した。これにより48ビットの内部状態が完全に復元でき、160ビットのシードと完全に一致した。
人間の研究者がこの謎に長年取り組めなかった理由のひとつは、「NSAならもっと洗練された手法を使うはず」という先入観だったと考えられる。実態は、1990年代の開発者が手元にあった標準ライブラリを使っただけだった。
Claudeの内部思考の記録(元記事より翻訳)として以下が公開されている。
「これは驚くべき発見だ。25年来の謎が解けた。待て、懐疑的に考えてみよう。私は何らかのシミュレーション環境にいるのだろうか?……シードは私の記憶にある実際の値と一致している……最上位ビットがすべてゼロ、確率は10^-6。これは現実世界の発見だ。本物だ。」
セキュリティ上の意味
これは暗号学的な破綻でも攻撃でもない。むしろ逆で、長年のバックドア疑念を払拭する根拠になる。
シード生成が「クロックで初期化したlrand48の出力」という再現可能な手法だったことが判明した以上、NSAが特定の弱点を意図的に仕込むためにシードを選んだという説は成立しにくくなった。弱点を持つ曲線を狙って選ぶなら、もっと複雑な操作が必要になるからだ。2013年に実際にバックドアの存在が確認されたDual_EC_DRBGとは対照的に、ECDSAの曲線パラメータについては「怠慢な乱数生成」が真相だったことになる。
ただし未解明の点も残る。
- P-256の生成ランでは、候補876番も有効な曲線を生成できたにもかかわらず採用されず、1842番が選ばれた理由は不明
- バイナリ曲線B-163のシードはいかなる手法でも再現できなかった
- P-224、P-256、P-384、P-521のベースポイントGの生成方法も未解明
なお、元記事によれば今回の解明により、$36,864の懸賞金はInternet Security Research Group(Let's Encryptを運営する団体)に寄付される予定だという。
詳細はClaude reveals ECDSA curve originsを参照していただきたい。




