なぜ仮想通貨は「乱数不足」で今も数十億円が消えるのか
エントロピー基準が徹底されなければ、次の数十億円規模の損失はすでに進行中かもしれません。
この記事は次の言語でご利用いただけます:
2026年7月31日、攻撃者が約25分で500件ほどのBitcoinウォレットを空にしました。合計594BTC(約3,800万ドル相当)が移動され、被害者は「この事態を避けるため」にハードウェアウォレットを購入していた人たちでした。
Coinkite disclosed that COLDCARDファームウェアが、デバイス内蔵のハードウェア乱数生成器ではなく、ソフトウェアの擬似乱数生成器を使って鍵を作成していたことが判明しました。コードベース内で2つの関数が同じ名前・シグネチャを持っていたため、リンカが誤った関数を選び、ビルド時にも警告が出ませんでした。
これは長い歴史の中で新たに加わった一例にすぎません。過去10年、仮想通貨の巨額流出は、奇抜なハッキングよりも「十分にランダムでなかった乱数」が原因となるケースが目立っています。
秘密鍵の裏側にあるものは?
仮想通貨ウォレット(アプリ・ブラウザ拡張・ハードウェア問わず)は、「誰にも推測・再現できない乱数を生成する」ことが最重要の役割です。ここで言うエントロピーとは、「生成された数値の予測不可能性」の度合いを指します。
エントロピーは、ウォレットが秘密鍵を作成する際に使う「生のランダム性」で、ビット数で測定されます。ビット数が多いほど、攻撃者が総当たりで探すべき鍵の空間が広がります。これはウォレットのセットアップ時に注入され、その後の鍵・アドレス・署名はすべて決まった数学的ルールに従うため、新たな乱数は後から追加されません。
エントロピーの供給源
理論上、ウォレットは擬似乱数生成器(PRNG)から乱数を取得できます。これは少量の「真の」エントロピーを必要なだけ引き伸ばすアルゴリズムですが、スタート時のシード自体が予測不可能でなければ意味がありません。
ブラウザタブや起動直後のスマートフォン上で動作するソフトウェアは、まるで「感覚遮断室」にいるような状態から始まります。本当にランダムな数を生み出すには、プログラムが「ノイズ」――純粋な計算外からの予測不能な入力――を必要とします。これはCPUのタイミングの揺らぎやマウスの動き、特殊なハードウェア部品などから得られます。
デバイス起動直後の数ミリ秒間は、こうしたノイズプールが空だったり、初期化が不十分な場合があります。暗号ライブラリが早すぎるタイミングで乱数生成器を呼び出すと、「一応ランダム」ではあるものの、総当たりで探しきれるほど小さな空間から値を引いてしまうリスクがあります。
ブラウザにも独自の制約があります。JavaScriptのMath.random()はそもそもセキュリティ用途向けに設計されておらず、より安全なcrypto.getRandomValues()でさえOSのエントロピープールに依存します。モバイルサンドボックスや仮想マシン、IoTデバイスのようにプールが弱い場合、乱数は秘密鍵生成コードに届く前からすでに危険な状態です。
トランザクション署名時の乱数
BitcoinやEthereumのトランザクション署名時、秘密鍵を直接使うのではなく、nonce(使い捨ての乱数)を生成し、秘密鍵と組み合わせてECDSA(楕円曲線デジタル署名アルゴリズム)で署名を作ります。
ここで問題となるのは、「同じnonceを同じ秘密鍵で2回使う」と、数式的に秘密鍵を逆算できてしまう点です。
ECDSA署名は(r, s)という2つの数値ペアで、次の要素を含みます:
- 秘密鍵(d)
- nonce(k)
- ハッシュ化されたトランザクションメッセージ(z)
もしkが2つの異なるメッセージで同じなら、数式が並び、両方の署名を見た第三者がkを計算できます。kがわかればd(秘密鍵)は掛け算と逆元計算だけで導き出せてしまいます。
2013年、AndroidのSecureRandom関数に不具合があり、初期のBitcoinウォレットで予測可能なnonceが生成されていました。その結果、多くのユーザーが問題に気付く前に資金が消失しました。
通常のコーディングミスと違い、乱数の質の低さはソースコードを見ただけでは判断できません。関数呼び出し自体は正しく見えても、実際に出力されるビットを測定し、統計テストで予測不可能性を検証しない限り、致命的な弱点が長期間気付かれず潜んでいる可能性があります。
エントロピーが長年脆弱性として残り続ける理由は、次のようにまとめられます:
起動直後のエントロピードライ:電源投入直後のデバイスは、PRNGのシードとなる環境ノイズが十分に蓄積されていないことがあります。
ブラウザの制限:JavaScriptのMath.random()は安全ではなく、crypto.getRandomValues()もホスト環境のエントロピープールに依存します。
危険なツール:バニティアドレス生成ツールやオフラインスクリプト、管理が不十分なライブラリは、速度や再現性を優先して乱数を省略しがちです。
人間の入力:「ブレインウォレット」や自分で決めたフレーズは、辞書攻撃で簡単に破られます。
暗号の専門家は昔から、ハードウェア乱数生成器(HRNG、真性乱数生成器)を好みます。電子ノイズや熱雑音、放射性崩壊など物理現象をランダムビットに変換し、自ら故障や偏りを常時テストできます。
ハードウェアが解決する方法
信頼性の高いシステムでは、解決策はシンプルです。「認証済みHRNGを内蔵したチップ内で鍵を生成し、その鍵を決して複製しない」ことです。
A secure element is a purpose-built, tamper-resistant microcontroller. It is a fortified chip designed to store secrets and perform cryptographic operations without revealing the underlying keys. They are the same class of component used in passports to prevent cloning, SIM cards to authenticate devices to mobile networks, and contactless payment cards to authorize transactions.
セキュアエレメントは、熱雑音や発振器のジッターなど物理ノイズから予測不可能性を得るハードウェア乱数生成器を内蔵できます。これは数学的アルゴリズムだけに頼るのではなく、物理現象を直接利用します。
こうしたHRNGは「一度きり」ではありません。NIST SP 800-90Bのような基準では、全ての出力ストリームに対して統計的なバイアスやビットの固着、その他の異常を常時チェックする「ヘルステスト」が義務付けられています。異常があれば、チップは即座に鍵生成を停止できます。優れたハードウェアウォレットでは、セキュアエレメントのHRNGが乱数を直接鍵生成プロセスに供給します。
すべての「ハードウェア」が同じではない
ハードウェアウォレットという言葉は幅広い設計を含みますが、乱数や鍵の隔離に対する保護レベルは機種によって大きく異なります。
下位モデルでは、汎用マイコン(柔軟性重視で物理攻撃やサイドチャネル攻撃への耐性が低いチップ)上に構築されたものも多く、簡易的な乱数生成器しか搭載されていない場合があります。
しかも、内部状態からシードされた擬似乱数生成器で、本来求められるHRNG基準を満たしていないことも。こうした設計では、鍵生成がファームウェア内で行われ、生成された秘密鍵が一時的にRAMやフラッシュメモリに保存されます。つまり、ファームウェアのバグやサイドチャネル攻撃、物理的な改ざんで鍵が漏洩するリスクがあります。
一方、セキュアエレメント搭載型ウォレットは、エントロピー源と鍵生成ロジックの両方を耐タンパー環境内に置きます。このモデルではアクセス制御も厳格で、暗号処理(署名・派生)はチップ内で完結し、外部に出るのは最終的な署名や公開鍵のみ。秘密鍵自体は決して外に出ません。
すでに存在する標準規格
乱数問題は「未解決の科学」ではありません。暗号の専門家は「良いエントロピー」の基準をすでに定めています。米国国立標準技術研究所(NIST)はSP 800-90シリーズで問題を明確に分解しています。
SP 800-90Bは、エントロピー源(予測不能なビットを生み出す物理・ソフトウェアプロセス)の評価方法を定めています。各ビットストリームの真のエントロピー推定や、バイアス・故障を監視するヘルステストが必須です。
SP 800-90Cは、そのエントロピーを決定論的乱数ビット生成器(DRBG)と組み合わせて、どちらか一方が劣化しても出力の強度を保つ方法を解説しています。
基準に準拠したデバイスは、乱数を一度生成して終わりではありません。HRNGのノイズパターンが変化したり、ビットが固着したり、統計的閾値を下回った場合は、システムが鍵生成を停止し、弱い鍵の発行を防ぎます。
自分の鍵は大丈夫?
ほとんどのユーザーはエントロピーを直接測定できませんが、「どこで・どうやって鍵が生成されたか」は確認できます。「ウェブページ上」や「古いAndroidアプリ(特に2010年代半ば以前)」で作成した鍵は、弱い可能性が高いです。最も安全なのは、認証済み・記録された乱数を使うハードウェアデバイス上で新しいウォレットを作り、資金を移す方法です。
エントロピー攻撃の歴史
エントロピー不足だと、攻撃者は「逆算」すら不要です。壊れた乱数生成器が出しうる鍵の候補を全列挙し、それぞれのアドレスを導出、ブロックチェーン上で残高をチェックするだけです。主な事例は以下の通りです:
2018年—IOTAシード生成詐欺:ユーザーにウェブサイトでウォレットシードを作らせ、運営者がそのコピーを保持。後日資金を抜き取り、約400万ドルが盗まれました。この場合、乱数はゼロ――攻撃者は最初からシードを知っていました。
2019年—Blockchain Bandit:セキュリティ研究者が732件の弱いEthereum秘密鍵を発見。未知の攻撃者が数年にわたりこれらのアドレスを監視し、資金が入るとすぐ約45,000ETHを抜き取っていました。
2022年—Profanityバニティアドレス事件:オープンソースのProfanityツールが、わずか32ビット(約40億通り)のエントロピーでEthereumアドレスを生成。現代のGPUなら数時間で全探索可能で、ロンドンのマーケットメイカーWintermuteが約1億6,000万ドルを失いました。
2023年—Trust Walletブラウザ拡張の脆弱性:Ledgerのセキュリティチームによる開示で、ブラウザ拡張が約32ビットのエントロピーしかないシードを生成していたことが判明。すぐ修正され、Trust Walletは一部ユーザーに補償しましたが、数か月間は誰でもリスクに晒されていました。
2025年—LuBian事件疑惑:Arkhamの主張は未検証ですが、127,426BTCの損失が予測可能な鍵生成に起因するなら、「生成時の一度のミスが数十億ドル規模の資産を失わせる」典型例となります。
2026年—COLDCARD事件:Coinkiteは、出荷ファームウェアで本来のハードウェア乱数生成器の代わりにソフトウェア擬似乱数生成器が使われていたと公表しました。このバックアップ実装は2018年5月に依存関係として追加され、2021年3月から鍵生成に使われていました。
Coinkiteの試算では、Mk3ハードウェアでは実効40ビット、セキュアエレメントを混ぜた後継モデルでも約72ビットの探索空間しかなく、128ビット目標を大きく下回ります。
本来この事態を防ぐガードがありましたが、設定マクロが「定義されているか」しか見ておらず、値がゼロでもチェックが通り、エラーが発火しませんでした。
COLDCARDからの乗り換えを検討中ですか?
Tangemは、認証済みセキュアエレメントチップ内でハードウェア乱数生成器を使って秘密鍵を生成します。
シードフレーズ管理にもううんざりなら、シードレス設計なら12単語や24単語を書き留めたり、写真を撮ったり、紛失したりする心配がありません。過去の多くのウォレット流出は、まさにこの点が原因でした。
Cure53、Kudelski、Riscureによる独立監査済み。まさに今のために設計されています。
「本当にランダムな乱数」でコインを守りましょう。Tangem Walletで始めてください。