entropy-randomness
TARGET_LOCALE: ja
title: "暗号通貨におけるエントロピーとランダム性: なぜ重要なのか" description: "エントロピーとランダム性が暗号通貨のセキュリティに不可欠な理由を理解しましょう。エントロピー源、CSPRNG、弱い乱数への攻撃、鍵生成が安全であることを検証する方法を学べます。" keywords: [エントロピー, ランダム性, CSPRNG, 暗号セキュリティ, 鍵生成, 乱数生成器, 暗号通貨] sidebar_position: 7
暗号通貨におけるエントロピーとランダム性: なぜ重要なのか
あらゆる暗号通貨の秘密鍵、あらゆるシードフレーズ、そしてあなたが使うすべてのアドレスは、ランダムな数値から始まります。あなたの暗号資産ポートフォリオ全体の安全性は、1つの前提に依存しています。その数値が本当に予測不可能だった、という前提です。もし鍵を生成した乱数生成器が弱い、偏っている、または予測可能だった場合、資金は盗まれ得ます。暗号を破るのではなく、鍵を推測されることで失われるのです。
このガイドでは、暗号分野におけるエントロピーの意味、乱数生成器の仕組み、ランダム性が破綻したときに歴史上何が起きたか、そして鍵生成の健全性を確認する方法を説明します。
エントロピーとは何か?
情報理論では、エントロピーはデータに含まれる不確実性や予測不可能性の量を測る指標です。暗号学では、ある値が持つ真のランダム性のビット数をエントロピーとして定量化します。
256ビットの秘密鍵は256ビットのエントロピーを持つべきです。これは、攻撃者がそれを見つけるには平均して 2^255 回の推測(探索空間の平均半分)が必要であることを意味します。もし鍵が実際には32ビットのエントロピーしか持っていなかった場合(RNGの欠陥による)、攻撃者が必要とする推測回数は約 2^31 回、つまり約20億回に過ぎず、現代のコンピュータなら数分で総当たり可能です。
エントロピーの測定
エントロピーはビット単位で測定されます。確率変数 X のエントロピーは次のとおりです:
H(X) = -sum(p(x) * log2(p(x))) for all possible values x
一様ランダムな256ビット値の場合:
- 各ビットが0または1である確率はそれぞれ0.5。
- エントロピー = 256ビット(このサイズで最大)。
各ビットが1になる確率0.7の偏った生成器の場合:
- 1ビットあたりのエントロピー = -(0.7 * log2(0.7) + 0.3 * log2(0.3)) = 0.881 bits。
- 256ビット全体のエントロピー = 225.5ビット(理想より11.9%低い)。
小さな偏りでも多くのビットにわたって累積し、実効的なセキュリティレベルを大きく下げる可能性があります。
BIP-39 におけるエントロピー
| ニーモニック長 | エントロピー | セキュリティレベル | 10^12/秒での総当たり |
|---|---|---|---|
| 12語 | 128ビット | 128-bit | 約10^19年 |
| 15語 | 160ビット | 160-bit | 約10^28年 |
| 18語 | 192ビット | 192-bit | 約10^38年 |
| 24語 | 256ビット | 256-bit | 約10^57年 |
これらの数値は、エントロピーが真に一様であることを前提としています。RNGに欠陥があると、実際のセキュリティレベルは劇的に低下する可能性があります。
乱数生成器の種類
真性乱数生成器 (TRNG)
TRNGは、量子レベルで本質的に予測不可能な物理現象をサンプリングします:
- 熱雑音 - 電子の熱運動によって抵抗に生じるランダムな電圧変動。
- ショット雑音 - 電子流が離散的であることによる電流のランダムな揺らぎ。
- 放射性崩壊 - 個々の崩壊イベントのタイミングは根本的に予測不能。
- 大気雑音 - 雷などの大気プロセスによる無線周波数ノイズ。
Ledger や Trezor のようなハードウェアウォレットはオンチップTRNGを使用します。これらは物理ノイズ源をサンプリングし、ホワイトニングと健全性テストを通して出力を整えます。
利点: 物理現象に基づく真のランダム性。予測可能な決定論的内部状態がない。
欠点: ハードウェア依存。ノイズ源が劣化すると無音で失敗する可能性。スループットが限定される場合がある。
暗号学的擬似乱数生成器 (CSPRNG)
CSPRNGは、十分にランダムなシードが与えられたとき、真の乱数と見分けがつかない出力を生成する決定論的アルゴリズムです:
- Linux:
/dev/urandom(ChaCha20 または類似暗号を使用。ハードウェアエントロピーでシード)。 - macOS:
/dev/urandom(arc4random。ハードウェアエントロピーでシード)。 - Windows:
BCryptGenRandom(CNGプロバイダ)。 - Webブラウザ:
crypto.getRandomValues()(OSのCSPRNGに委譲)。 - Python:
os.urandom()またはsecretsモジュール。 - Node.js:
crypto.randomBytes()。
利点: 高速。十分に研究されたアルゴリズム。全プラットフォームで利用可能。
欠点: 初期シードのエントロピー強度に依存。決定論的であり、内部状態が知られると将来の出力が予測可能になる。
非暗号用途PRNG(鍵生成には絶対に使わない)
多くのプログラミング言語の標準ライブラリ乱数関数は、統計シミュレーション向けであり暗号用途向けではありません:
- Python:
random.random()(Mersenne Twister。決定論的で、624出力から状態復元可能)。 - JavaScript:
Math.random()(V8の xorshift128+。予測可能)。 - C:
rand()(線形合同法。容易に予測可能)。 - Java:
java.util.Random(線形合同法。予測可能)。
これらの生成器はエントロピーが低く、周期が短く、状態が予測可能です。鍵生成に使うことは、実質的にランダム性を使っていないのと同じです。これらの関数で秘密鍵やシードフレーズを生成してはいけません。
ランダム性の歴史的な失敗例
Android SecureRandom バグ (2013)
2013年8月、Androidの SecureRandom 実装に重大な欠陥が発見されました。一部のAndroid端末でJava PRNGが適切にシードされず、複数の Bitcoin ウォレットアプリが予測可能な状態から秘密鍵を生成していました。攻撃者はこれを悪用して約55 BTCを盗みました。このバグはECDSA署名のノンス生成に影響し、同じノンスを2回使うと2つの署名から秘密鍵を計算できます。
"Blockchain Bandit" (2019)
セキュリティ研究者 Adrian Bednarek は、極端に弱い秘密鍵(1、2、3、または単純な辞書語を1回ハッシュしたもの)で生成されたウォレットを発見しました。攻撃者は何年もこれらのアドレスから資金を体系的に回収し、45,000 ETH超を蓄積していました。banditは低エントロピー鍵を列挙し、資金の有無を確認するだけでした。
流出した鍵の例:
- 秘密鍵
0x0000000000000000000000000000000000000000000000000000000000000001(数値の1) - 一般的なパスワードやフレーズから導出された秘密鍵
Milk Sad 脆弱性 (2023)
libbitcoin-explorer (bx) ツールの seed コマンドは、システム時刻の32ビットのみでシードされた Mersenne Twister を使用していました。これは、このツールで生成されたすべての鍵が最大32ビットのエントロピーしか持たないことを意味します(約43億通り)。攻撃者は総当たりでこれらの鍵を破り、資金を盗みました。
Debian OpenSSL 弱鍵バグ (2008)
Debianのメンテナが誤って、OpenSSLの乱数生成器にエントロピーを供給するコード1行を削除しました。2年間(2006-2008)、DebianとUbuntuで生成されたすべての暗号鍵はプロセスID由来の15ビットのエントロピーしか持たず、最大32,767個の一意鍵しか生成されませんでした。この期間に影響システム上で生成されたSSH鍵、SSL証明書、暗号通貨鍵はすべて危殆化しました。
学んだこと
- 検証なしで単一のエントロピー源を信用してはいけない。
- 小さな実装ミスでもエントロピーを壊滅的に減少させる。
- 攻撃者は弱いランダム性を実際に悪用する。理論上の話ではない。
- エントロピーが重要な処理には、オープンソースで監査済みのコードが不可欠。
エントロピー源の詳細
OSのエントロピープール
現代のOSは、複数ソースから供給されるエントロピープールを維持します:
- 割り込みタイミング - ハードウェア割り込み(キーボード、マウス、ディスク、ネットワーク)のタイミングは予測不能な入力を提供。
- ディスクI/Oタイミング - ディスク読み書きの厳密なタイミングは機械的・電子的要因で変動。
- ハードウェアRNG - 現代CPU(Intel RDRAND、AMD)はオンチップ乱数生成器を搭載。
- 起動時エントロピー - 一部システムは再起動間でエントロピーを保存(Linuxの
/var/lib/systemd/random-seed)。
OSはこれらのソースを暗号プリミティブで混合してエントロピープールを作り、それを使ってCSPRNGをシードします。現代のLinuxカーネル(5.18+)では、/dev/urandom は起動時に十分なエントロピーが集まるまでブロックし、その後は二度とブロックしません。
ブラウザのエントロピー (crypto.getRandomValues)
SafeSeed のジェネレータのようなWebベースツールを使う場合、ブラウザの crypto.getRandomValues() APIが使用されます。これはOSのCSPRNGに委譲されます:
- Chrome: OS CSPRNGに委譲(BoringSSL)。
- Firefox: OS CSPRNGに委譲(NSS)。
- Safari: OS CSPRNGに委譲(CommonCrypto)。
基盤となるOSが安全である限り、鍵生成用途として安全と見なされます。主な懸念は、OS CSPRNG自体が危殆化しうる環境で動作させることです(例: エントロピー源が不足した仮想マシン、または侵害されたOS)。
ハードウェアウォレットのエントロピー
ハードウェアウォレットはオンチップ真性乱数生成器を使用します:
- Ledger (Secure Element ST33): ST33チップのTRNGを使用し、アナログノイズをサンプリング。出力は使用前にNIST SP 800-90B健全性テストを通過。
- Trezor: STM32チップのハードウェアRNGを使用。Trezorはユーザー提供のサイコロエントロピー混合もサポート。
- Coldcard: ATECC608A secure element のTRNGとMCUのハードウェアRNGを併用し、両ソースを混合。
サイコロロールのエントロピー
手動でサイコロを振る方法は、最も透明性の高いエントロピー生成方法です:
- 公平な6面サイコロ1回で log2(6) = 2.585ビットのエントロピーを生成。
- 100回で約258.5ビットのエントロピーを生成し、24語シードフレーズに十分。
- ユーザーが物理的にランダム性を検証可能(公平なサイコロ、公平な振り方、操作なし)。
サイコロの公平性を検証する方法:
- カジノグレードの精密サイコロを使う(角が丸くない鋭いエッジ)。
- 固く平らな面で、バックストップ付きで振る。
- サイコロを「置く」のではなく、自由に転がるようにする。
- 各結果を即時かつ順番どおりに記録する。
SafeSeed Seed Phrase Generator では、独自のエントロピー(サイコロ結果など)を入力して BIP-39 シードフレーズを生成できます。これにより、ツールの正しい BIP-39 実装の利点を得ながら、ランダム性の源を自分で検証できます。最大の安全性のため、ツールはオフラインで使用してください。詳しくはオフライン鍵生成ガイドを参照してください。
ランダム性のテストと検証
NIST 統計テストスイート
NIST SP 800-22 は、乱数生成器を評価する統計テスト群を定義しています:
- Frequency test - 0と1の数はおおむね等しいか?
- Block frequency test - ビットのサブブロックはおおむね均等に分布しているか?
- Runs test - 同一ビットが連続する列(ラン)の長さは期待どおりか?
- Longest run test - 最長ランは期待範囲内か?
- Matrix rank test - 2進行列のランクは期待分布に従うか?
- Spectral test - ビット列のDFTは期待特性を示すか?
これらのテストは偏りやパターンを検出できますが、生成器が安全であることを証明はできません。失敗を検出できるだけです。
Dieharder テストスイート
元のDiehardテストに追加テストを加えた、より包括的な統計テスト群です。Linuxでオープンソースソフトウェアとして利用可能です。
ユーザー向けの実践的な検証
多くのユーザーはNISTテストスイートを実行できません。実践的な検証手順は次のとおりです:
- ソース検証 - ツールは
crypto.getRandomValues()、os.urandom()、またはハードウェアRNGを使っているか? ソースコードを確認。 - 複数生成テスト - 複数のシードフレーズを生成し、毎回異なることを確認。
- エントロピー表示 - 一部ツールは生のエントロピーを表示。明らかなパターンがないか確認。
- オープンソース監査 - ツールはオープンソースか? 監査済みか?
エントロピー源の混合
高セキュリティな鍵生成のベストプラクティスは、複数のエントロピー源を混合することです:
Final Entropy = Hash(Hardware RNG output || OS CSPRNG output || User dice rolls || Timing data)
ソース混合により、1つのソースが侵害または偏っていても、少なくとも1つが十分なエントロピーを提供していれば最終出力は安全性を維持できます。これは設計の良いハードウェアウォレットや鍵生成ツールで採用される手法です。
XOR 混合
単純な混合法としてXORがあります。ソースAから256ビット、ソースBから256ビットがある場合:
Mixed = A XOR B
AまたはBのどちらか一方が真にランダムなら、結果も真にランダムです。両方が独立な偏りを持つ場合でも、結果はどちらか単独より偏りが小さくなります。
ハッシュ混合
長さや品質が異なるソースを混合する場合は、まとめてハッシュします:
Mixed = SHA-256(Source_A || Source_B || Source_C)
ハッシュ関数はエントロピー抽出器として働き、入力形式に関係なく一様な出力を生成します。
マルチシグ構成におけるエントロピー
マルチシグウォレットはエントロピーの冗長性を提供します。たとえ1つの鍵が弱いエントロピーで生成されていても、攻撃者は他の鍵も侵害する必要があります。各鍵を独立生成した2-of-3マルチシグの安全性は、最弱鍵ではなく最強鍵に相当します。
これは高額資産保管において、マルチシグ構成を採用する強力な根拠です。
FAQ
暗号通貨におけるエントロピーとは何ですか?
エントロピーは、暗号鍵生成に使われるデータのランダム性・予測不可能性の尺度です。暗号通貨では、秘密鍵とシードフレーズの安全性は十分なエントロピーに完全に依存します。256ビット鍵は256ビットの真のランダム性を含むべきで、エントロピーが低いと鍵は推測可能になります。
安全なウォレットにはどれくらいのエントロピーが必要ですか?
12語の BIP-39 シードフレーズは128ビット、24語は256ビットのエントロピーを提供します。どちらも現在の技術では総当たり攻撃に対して安全と見なされます。高価値資産の長期保管には、最大の安全余裕を確保するため256ビット(24語)を推奨します。
暗号鍵生成に Math.random() は安全ですか?
まったく安全ではありません。Math.random() や同様の非暗号用途PRNG(Pythonの random、Cの rand())は決定論的で予測可能、かつ低エントロピーです。暗号鍵生成に使ってはいけません。ブラウザでは crypto.getRandomValues()、Pythonでは os.urandom()、またはハードウェア乱数生成器を使用してください。
自分でランダムな数を思い浮かべてエントロピーを作れますか?
できません。人間はランダムな数生成が非常に苦手です。研究でも、人間が選んだ「ランダム」列は見かけよりはるかに低エントロピーであることが繰り返し示されています。代わりに、物理プロセス(サイコロ、ハードウェアRNG)か暗号学的に安全なソフトウェアRNGを使ってください。
ウォレットの乱数生成器が安全かどうかはどう検証しますか?
ウォレットのソースコード(オープンソースの場合)を確認し、CSPRNGまたはハードウェアTRNGを使っていることを検証してください。crypto.getRandomValues()、os.urandom()、またはハードウェアRNG APIの呼び出しを確認します。ハードウェアウォレットでは、メーカーのセキュリティ資料と第三者監査レポートを確認してください。
"blockchain bandit" とは何で、エントロピーについて何を示しましたか?
"blockchain bandit" は、弱い秘密鍵(1、2、3や単純パスワード由来鍵)で生成されたウォレットから暗号資産を体系的に盗んだ攻撃者です。これは、攻撃者が低エントロピー鍵を実際に列挙し、見つけた資金を回収していることを示しました。高エントロピーな乱数生成の重要性を強く裏付ける事例です。
ハードウェアウォレットの乱数生成器は信頼できますか?
ハードウェアウォレットのTRNGは一般に信頼できますが、単一の信頼点でもあります。最大限の安全性のため、ハードウェアRNG出力にユーザー提供エントロピー(サイコロ)を混合できます。Trezor や Coldcard など一部のハードウェアウォレットはこの混合をネイティブにサポートします。これにより、ハードウェアRNGが侵害されても生成鍵の安全性を維持できます。
OS(Linux、macOS、Windows)は鍵の安全性に影響しますか?
はい。OSのCSPRNGの品質と実装は鍵の安全性に影響します。現代のLinux、macOS、Windowsはいずれも暗号学的に安全な乱数生成器(/dev/urandom、arc4random、BCryptGenRandom)を提供しています。ただし、2006-2008年のDebian OpenSSLバグが示したように、OSレベルの脆弱性はエントロピーを壊滅的に低下させる可能性があります。OSを最新に保ち、十分に監査されたソフトウェアを使用してください。