概要
ECDSA曲線のシード生成の謎 がついに解明。 lrand48擬似乱数生成器 と Unixタイムスタンプ が用いられていた事実。 暗号的な脆弱性や裏口の証拠はなし、信頼性がむしろ向上。 一部未解明の点や今後の課題 も残る。 AnthropicとClaudeによる画期的な発見。
ECDSA曲線シード生成の謎、ついに解明
- ECDSA は最も広く使われている楕円曲線暗号規格。
- NIST が2000年にFIPS 186-2で標準化、NSAから提供された シード値 が説明なく公開。
- 代表例: NIST P-256 のシード値(C49D3608...)の出所が長年不明。
- KoblitzとMenezesによる「A Riddle Wrapped in an Enigma」で懸念が整理。
- アマチュア調査や賞金 も設けられたが、長年未解決。
Claudeによる大発見
- 2026年、Anthropicの社員が Claude にシード生成方法を尋ねる。
- P-192, P-224, P-256, P-384, P-521 の各シードが「ハッシュ」ではなく lrand48擬似乱数生成器 の出力であることを突き止める。
- lrand48 はC言語標準ライブラリのPRNGで、 Unixタイムスタンプ を初期値に使用。
- 例:P-256は1842回のイテレーション後の値が採用。
- 暗号学的な弱点や攻撃手法の発見ではない ため、信頼性はむしろ向上。
技術的な解析手法
- 噂になっていたパスフレーズのハッシュ 説は誤りと判明。
- Claudeは 1990年代のCライブラリPRNG の出力パターンに着目。
- lrand48 の特徴:出力最上位ビットが0になりやすい(31ビット出力)。
- PRNGの内部状態 を推定し、 Lenstra–Lenstra–Lovász (LLL) アルゴリズム で状態復元。
- 10個の標準曲線シード が全てこの手法で再現可能。
シード生成の再現コード
- srand48 でUnixタイムスタンプを初期化、 lrand48 で乱数を生成。
- Pythonによる再現コードが公開されている。
- 例:P-256は1997-08-16 01:52:34のタイムスタンプで候補1842番目の乱数がシード。
ベースポイントの謎と一部未解明点
- ベースポイントG の生成方法も部分的に解明。
- 1997年5月生成の6曲線は FreeLIP の乱数生成器を使用、シード値も特定。
- P-224, P-256, P-384, P-521のベースポイント生成方法は未解明。
- 一部シード(例:B-163) は依然として不明。
- 候補曲線の一部がスキップされている 理由も不明。
今回の発見の意義
- シード値がシンプルな方法で生成 されていたことが証明され、 裏口や意図的な弱体化の可能性が大幅に低減。
- NIST曲線パラメータの信頼性が向上。
- 今後の課題 :一部未解明のシードやベースポイントの生成方法の解明。
調査チームと謝辞
- Anthropic のJohn Wood、Henry de Valence、Ava Howellらによる調査。
- 故Jerry Solinas氏やNIST Elliptic Curves Seeds Bountyの主催者Filippo Valsordaに感謝。