【ITニュース解説】Claude Traced the NIST Curve Seeds to a 1997 Clock and lrand48. Nothing to Rotate on P-256
2026年10月17日に「Dev.to」が公開したITニュース「Claude Traced the NIST Curve Seeds to a 1997 Clock and lrand48. Nothing to Rotate on P-256」について初心者にもわかりやすく解説しています。
ITニュース概要
P-256暗号のシードは、NSAの秘密ではなく、1997年のC言語の疑似乱数生成器から作られたことが判明した。これによりバックドアの疑いは薄れたが、既存システムでの変更は不要。重要なのは、セキュリティに関わる乱数は暗号学的に安全な方法で生成することだ。
ITニュース解説
長い間謎とされてきた、インターネットの安全を守る重要な暗号技術「P-256曲線」の「シード(seed)」の出所が、AIの活躍によりついに明らかになった。この発見は、P-256曲線自体の安全性に影響を与えるものではなく、既存のシステムに変更を加える必要はないとされている。しかし、今回の件は、システム開発において「乱数」をどのように扱うべきかについて、私たちに貴重な教訓を与えている。
P-256曲線とは、私たちが日常的に利用するウェブサイトのHTTPS通信や、電子メールの署名、スマートフォンのセキュリティなど、さまざまな場面で使われているデジタル署名技術「ECDSA(楕円曲線デジタル署名アルゴリズム)」の根幹をなすものだ。特に、ウェブ上でユーザー認証によく使われる「JWT(JSON Web Token)」の「ES256署名」の基盤としても利用されている。このP-256曲線を含むいくつかの曲線は、2000年にアメリカ国立標準技術研究所(NIST)によって標準化された際、「シード」と呼ばれる初期値から生成された。このシードの出所は長年明らかにされておらず、当時の標準化に米国国家安全保障局(NSA)が関与していたことから、「NSAが密かにバックドア(特定の人間だけがシステムに侵入できるような仕掛け)を仕込んだのではないか」という疑惑が囁かれていた。この疑惑は、もし本当にバックドアがあれば、特定の条件下で暗号が破られ、情報が漏洩する危険性があるため、サイバーセキュリティの専門家たちの間で大きな関心事となっていたのだ。
そして今回、AI開発企業のAnthropic社が開発したAIモデル「Claude」が、この長年の謎を解き明かした。Claudeは、P-256を含むNISTの標準曲線が使用しているシードが、1997年から1998年頃に利用されていたC言語ライブラリに含まれる「lrand48」という擬似乱数生成器(PRNG)によって生成されたことを特定した。しかも、このlrand48は、当時の「Unixタイムスタンプ(コンピューターが時間を数えるための数値)」を「シード」として与えられていたという。つまり、NSAが秘密のパスフレーズをハッシュ化したものではなく、ごく一般的な擬似乱数生成器が、その生成時に合わせて取得した時刻情報を基にして乱数を生成していたのである。この発見は、わずか30分足らずでAIによって導き出され、その後、著名な暗号学者であるフィリッポ・ヴァルソルダ氏によってGo言語で再現・検証され、その正しさが確認された。これにより、長年のバックドア疑惑は完全に払拭された形となった。
この発見が示す最も重要な点は、P-256曲線自体に意図的な脆弱性やバックドアは存在しなかったということである。シードの生成プロセスに、特定の意図を持った不正な操作があったわけではないため、現在のP-256曲線を利用しているシステムに変更を加える必要は一切ない。既存の鍵を交換したり、別の曲線に切り替えたりするような緊急の対応は不要だ。今回の件は、P-256曲線が暗号学的に堅牢であることが改めて確認されたと解釈できる。
しかし、このニュースからシステムエンジニアを目指す初心者が学ぶべき重要な教訓が一つある。それは、「乱数」の適切な利用方法についてである。今回のシードは、擬似乱数生成器(PRNG)であるlrand48によって生成されていた。PRNGは、ある初期値(シード)から、まるでランダムに見える数字の列を生成するアルゴリズムだ。しかし、この生成プロセスは完全に決定論的であり、同じシードを与えれば常に同じ乱数系列が生成される。また、生成された乱数からシードを逆算することが比較的容易である場合も多い。今回のケースでは、古いC言語ライブラリのlrand48が、生成時に取得したタイムスタンプをシードとして使用していたため、AIがその生成時刻とアルゴリズムを推測することで、シードの出所を特定できたのだ。
このことから、セキュリティが要求される場面で、予測可能な擬似乱数生成器を安易に利用することの危険性が浮き彫りになる。例えば、ウェブサービスのセッションID、パスワードリセット用のトークン、APIキー、あるいは招待コードなど、他人に推測されては困る重要な情報が、もしタイムスタンプなどをシードとした予測可能な擬似乱数で生成されていたらどうなるだろうか。攻撃者は、生成時刻を推測し、その乱数を予測することで、他人のセッションを乗っ取ったり、システムに不正にアクセスしたりする危険性がある。
したがって、セキュリティが重要な場面では、一般的な擬似乱数生成器ではなく、「暗号学的に安全な乱数生成器(CSPRNG)」を使用する必要がある。CSPRNGは、生成される乱数列を予測することが非常に困難であるように設計されており、セキュリティ要件を満たすために不可欠な要素だ。現代の主要なプログラミング言語やOSは、このCSPRNGを簡単に利用できるモジュールやAPIを提供している。例えば、Pythonではsecretsモジュール、Node.jsではnode:cryptoモジュール、Go言語ではcrypto/randパッケージ、ウェブブラウザではcrypto.getRandomValues()といった機能が、暗号学的に安全な乱数を生成するために用意されている。開発者は、これらのセキュリティが考慮された機能を利用し、セッションIDやトークン、キーなどを生成することが極めて重要だ。
今回のAIによる発見は、長年の暗号技術の謎を解き明かしただけでなく、私たちが日常的に構築するシステムにおけるセキュリティの基本、特に乱数の適切な取り扱いについて、改めて深く考えるきっかけを与えてくれた。AIが複雑な問題を解決する能力を示した一方で、その結果を人間が検証し、実用的な教訓として活かすことの重要性も示している。全ての謎が解明されたわけではなく、P-224、P-256、P-384、P-521の基点がどのように生成されたかなど、まだ不明な点も残されているが、今回の成果は暗号技術の信頼性を高め、より安全なデジタル社会の実現に貢献する一歩となるだろう。