Entropyとは?暗号資産セキュリティを支えるランダム性
目次
すべての暗号資産ウォレットはランダムな数字から始まります。あなたが選んだパスワードでも、あなたが設計したパターンでもなく、物理世界から取得した生のランダム性です。このランダム性はエントロピーと呼ばれ、暗号資産が安全か脆弱かを決定する最も重要な単一の要素です。
ウォレットの背後にあるエントロピーが強ければ、攻撃者は鍵を見つけるために観測可能な宇宙の原子数よりも多い組み合わせを探索する必要があります。エントロピーが弱ければ、資金は数秒で盗まれる可能性があります。中間はありません。
エントロピーの定義¶
暗号学において、エントロピーはデータの予測不可能性を測定します。ビット単位で定量化されます。1ビットのエントロピーは単一の二項選択を表します:表か裏、0か1。2ビットのエントロピーは4つの可能な結果をもたらします。3ビットは8つ。追加のビットごとに可能性の数は2倍になります。
公式は簡単です:nビットのエントロピーは2^n個の可能な値を生成します。
この指数関数的成長がエントロピーを強力にします。小さな数では可能性は管理可能に見えます。暗号資産で使用されるビット数では、それらは理解を超えるほど大きくなります。
暗号の文脈でのエントロピーは比喩や抽象的な概念ではありません。シードフレーズ、秘密鍵、そして最終的にはアドレスを生成するための決定論的アルゴリズムに投入される、特定の測定可能なランダム性の量です。初期エントロピーの下流にあるすべては数学的に導出されます。エントロピー自体が、本当にランダムでなければならない唯一の部分です。
128ビット vs 256ビット¶
シードフレーズの生成方法を定義するBIP39標準は、2つの主要なエントロピー長をサポートしています:
128ビット(12ワードのシードフレーズ)¶
- 2^128個の可能なシードフレーズを生成
- これは340,282,366,920,938,463,463,374,607,431,768,211,456の組み合わせ
- 約3.4 x 10^38
256ビット(24ワードのシードフレーズ)¶
- 2^256個の可能なシードフレーズを生成
- これは約1.16 x 10^77の組み合わせ
- 観測可能な宇宙の推定原子数より多い
両方のレベルは現在の技術に対して安全と考えられています。128ビットのエントロピーはほとんどの消費者向けウォレットの標準であり、既知の計算方法では2^128の可能性を実用的な時間枠内で探索することはできません。256ビットオプションは、最大限の保護を望むユーザーや将来のコンピューティングの進歩を懸念するユーザーに追加のセキュリティマージンを提供します。詳細な比較については、シードフレーズのブルートフォースはどれくらい速い?をご覧ください。
エントロピービットとワード数の関係は簡単なルールに従います:11ビットのエントロピーがBIP39ワードリストの1つの単語にマッピングされます(2,048語、2^11 = 2,048)。12ワードのフレーズは128ビットのエントロピーと4ビットのチェックサムをエンコードします。24ワードのフレーズは256ビットのエントロピーと8ビットのチェックサムをエンコードします。このプロセスの完全な分解については、BIP39の解説をお読みください。
ランダム性のソース:ハードウェアRNGとWeb Crypto API¶
重要な問題は:エントロピーはどこから来るのか?すべての乱数生成器が同じように作られているわけではありません。
擬似乱数 vs 暗号学的に安全¶
標準的なプログラミングのrandom関数(JavaScriptの Math.random() など)は擬似乱数です。ランダムに見える数を生成するための数学的公式を使用しますが、完全に決定論的です。同じ開始シードが与えられれば、毎回同じシーケンスを生成します。これは暗号資産の鍵生成には壊滅的に不適切です。
暗号学的に安全な乱数生成器(CSPRNG)は、ハードウェアソースからの本物の物理的ランダム性を組み込むことでこれを解決します。
ハードウェア乱数生成器¶
現代のCPUには、物理現象からエントロピーを収集する専用のハードウェア乱数生成器が含まれています:
- Intel RDRAND/RDSEED: シリコン回路の熱雑音を使用
- ARM TrustZone TRNG: ハードウェアレベルのランダムビット生成を活用
- OSレベルのエントロピープール: Linuxの
/dev/urandom、WindowsのCryptGenRandom、macOSのSecRandomCopyBytesはすべて、割り込みタイミング、ディスクシーク変動、ネットワークパケット到着時刻などのハードウェアイベントによって供給されるエントロピープールを維持
これらの物理ソースは、システムのソフトウェア状態の完全な知識を持つ攻撃者でも予測できないランダム性を生成します。
Web Crypto API¶
ブラウザベースのツールでは、Web Crypto APIが crypto.getRandomValues() を通じてオペレーティングシステムの暗号学的乱数生成器へのアクセスを提供します。この関数はW3Cによって規定され、すべてのモダンブラウザに実装されています。ネイティブアプリケーションが使用するのと同じOSレベルのエントロピープールから取得します。
SafeSeedはすべての鍵生成にWeb Crypto APIを使用しています。ビットコインシードフレーズジェネレーターやイーサリアムシードフレーズジェネレーターを使用する際、エントロピーはデバイスのハードウェアから直接暗号学的に安全なランダムバイトを提供する crypto.getRandomValues() を通じて取得されます。サーバーでは何も生成されません;すべてブラウザで実行されます。
Web Crypto APIは Math.random() と同じではありません。暗号操作のために特別に設計された根本的に異なるシステムです。この区別は非常に重要です:Math.random() はほとんどの実装で約52ビットの内部状態しかなく、いくつかの出力を観察した攻撃者はすべての将来の出力を予測できます。crypto.getRandomValues() にはそのような弱点はありません。
エントロピーからシードフレーズへ¶
生のエントロピーからシードフレーズへの道のりは、BIP39仕様で定義された正確で決定論的なパスに従います:
ステップ1: ランダムバイトの生成¶
CSPRNGが16バイト(128ビット)または32バイト(256ビット)のランダムデータを生成します。
ステップ2: チェックサムの計算¶
エントロピーのSHA-256ハッシュが計算されます。このハッシュの最初の4ビット(128ビットエントロピーの場合)または8ビット(256ビットエントロピーの場合)がチェックサムとしてエントロピーに追加されます。
ステップ3: 11ビットグループに分割¶
結合されたエントロピー + チェックサムビットが11ビットのグループに分割されます。12ワードフレーズの場合:128 + 4 = 132ビット、12グループの11ビットに分割。
ステップ4: 単語へのマッピング¶
各11ビット値(0-2047)がBIP39ワードリスト(2,048語)のインデックスとして使用されます。結果があなたのニーモニックフレーズです。
ステップ5: シードの導出¶
ニーモニックフレーズは2,048回の反復でPBKDF2-HMAC-SHA512を通され、512ビットのシードを生成します。このシードはBIP44の導出パスに従ってHDウォレットツリーを導出するために使用されます。
ステップ1以降のすべてのステップは決定論的です。同じ128ビットのエントロピーは常に同じ12の単語、同じシード、同じアドレスを生成します。システム全体のセキュリティは、それらの初期ランダムバイトの予測不可能性にかかっています。
弱いエントロピーが資金盗難につながる場合¶
弱いエントロピーの結果は理論的なものではありません。ランダム性が失敗したときに何が起こるかを示す複数の実世界の事件があります。
Android SecureRandomの脆弱性(2013年)¶
2013年8月、AndroidのSecureRandom実装に欠陥が発見されました。Android上のJava暗号ライブラリが乱数生成器を適切にシードしておらず、一部のビットコインウォレットがエントロピー不足の秘密鍵を生成していました。攻撃者はこれを悪用して影響を受けたウォレットからビットコインを盗みました。
Blockchain Bandit(予測可能な鍵)¶
セキュリティ研究者のAdrian Bednarekは、攻撃者が弱い秘密鍵から導出されたアドレスについてイーサリアムブロックチェーンを体系的にスキャンした事例を文書化しました。0x0000...0001(数字の1)のような鍵や、単純なフレーズから導出された鍵が、エントロピーを理解していない人々によって使用されていました。自動ボットがこれらのアドレスを監視し、預金された資金を数秒以内に盗みました。
ブレインウォレット攻撃¶
ブレインウォレット — 記憶したパスフレーズから秘密鍵が導出されるもの — は、人間が選んだフレーズが人々が想像するよりもはるかに少ないエントロピーしか持たないため、繰り返し侵害されてきました。攻撃者は、ブレインウォレットが使用するのと同じ導出関数を通じて、フレーズ、歌詞、本の引用、一般的なパスワードの大規模な辞書を実行します。
これらの事件は共通の教訓を共有しています:暗号アルゴリズム自体(SHA-256、secp256k1、ECDSA)は破られていません。それらに投入されるエントロピーが不十分だったのです。
エントロピー品質のテスト¶
乱数生成器が品質の高いエントロピーを生成しているかどうかをどのように検証できますか?いくつかの統計的テストがあります:
NIST SP 800-22¶
米国国立標準技術研究所はランダム性に関する統計テストのスイートを公開しています。これには頻度テスト(0と1はおおよそバランスが取れているか?)、ラン検定(同一ビットのシーケンスは期待される長さか?)、行列ランクテストなどが含まれます。
Dieharderテストスイート¶
NIST スイートよりも厳しく生成器をテストする拡張ランダム性テストセットです。
実用的な検証¶
エンドユーザーにとって最も実用的な検証は、crypto.getRandomValues() または同等のOSレベルCSPRNGに依存するよく監査されたツールを使用していることを確認することです。自分の「ランダム性」を追加しようとすべきではありません(単語を自分で選ぶなど)。人間の選択は感じるよりもはるかにランダムではありません。
SafeSeedのツールはオープンソースであり、エントロピーソースが crypto.getRandomValues() であり、より弱い代替手段ではないことを誰でも検証できます。クライアントサイド生成が重要な理由のより広い議論については、オンラインシードジェネレーターは安全か?をご覧ください。
エントロピーとあなたのセキュリティ姿勢¶
エントロピーを理解することで、暗号セキュリティに対する考え方が変わります。12ワードのシードフレーズは単なる便利なバックアップメカニズムではありません。それは、すべての可能性を探索するのに宇宙に十分なエネルギーが含まれていないほど大きなランダムな数の人間可読エンコーディングです。
しかし、その保護は元のランダム数が本当にランダムであった場合にのみ成立します。ウォレットを生成するツールを選ぶ際は:
- エントロピーソースを検証する: ツールは
crypto.getRandomValues()、/dev/urandom、または同等のハードウェアバックドランダム性を使用する必要があります。 - カスタムエントロピーを避ける: 自分で単語を選んだり、偏った方法でサイコロを振ったり、「十分良い」と感じるランダム性のソースを使用しないでください。
- 確立された標準を使用する: BIP39は2013年以来、実戦でテストされてきました。SafeSeedのソラナシードフレーズジェネレーターのようにBIP39に正確に従うツールは、10年のセキュリティレビューを継承しています。
- 可能であればオフラインで生成する: 強力なエントロピーであっても、エアギャップまたはオフラインデバイスで鍵を生成することで、ネットワークベースの攻撃ベクトルを排除できます。実践的なガイドについては、ビットコインシードフレーズをオフラインで生成する方法をご覧ください。
エントロピーは目に見えません。見ることも感じることも、出力を見て検証することもできません。弱いエントロピーから生成されたシードフレーズは、強いエントロピーから生成されたものと見た目は同じです。セキュリティを確保する唯一の方法はプロセスを信頼することです:ハードウェアバックドの乱数生成器から取得する監査済みのオープンソースツールを使用し、この基盤で決して妥協しないことです。