BIP-39標準を解説: ニーモニックシードフレーズの仕組み
BIP-39(Bitcoin Improvement Proposal 39)は、暗号資産ウォレット鍵の導出に使うエントロピーを符号化するニーモニック文(一般的な12語または24語の並び)を生成する標準を定義しています。2013年にMarek Palatinus、Pavol Rusnak、Aaron Voisine、Sean Boweによって公開され、BIP-39はほぼすべての主要な暗号資産でウォレットバックアップの事実上の標準になりました。
BIP-39を技術的に理解すると、シードフレーズのバックアップが信頼できることに確信を持てるようになり、異なるウォレット実装のセキュリティ特性を評価しやすくなります。
BIP-39の概要
BIP-39は2つのプロセスを規定します。
- ニーモニック生成 — ランダムなエントロピーを人間が読める単語列に変換する。
- シード導出 — ニーモニック単語(および任意のパスフレーズ)を、BIP-32の階層的決定論的鍵生成で使える512ビットのバイナリシードに変換する。
この2つのプロセスは意図的に分離されています。ニーモニックは人間向けの表現で、シードは鍵導出のための暗号学的入力です。
ステップ1: エントロピー生成
プロセスは、暗号学的に安全なランダムデータ(エントロピー)から始まります。BIP-39は5つのエントロピーサイズをサポートします。
| Entropy (bits) | Checksum (bits) | Total (bits) | Words |
|---|---|---|---|
| 128 | 4 | 132 | 12 |
| 160 | 5 | 165 | 15 |
| 192 | 6 | 198 | 18 |
| 224 | 7 | 231 | 21 |
| 256 | 8 | 264 | 24 |
実運用では、ほぼすべてのウォレットが128ビット(12語)または256ビット(24語)を使います。ほかのサイズも仕様上は有効ですが、実装されることはまれです。
エントロピー源の品質は最重要です。乱数生成器に偏りや予測可能性があったり、エントロピーが不足していたりすると、生成されたシードフレーズを攻撃者に推測される可能性があります。このトピックの詳細はEntropy and Randomness guideを参照してください。
エントロピー源
- ハードウェア乱数生成器(HRNG) — LedgerやTrezorなどのハードウェアウォレットで使用されます。物理現象(熱雑音、ショットノイズ)をサンプリングして真の乱数を生成します。
- OSのCSPRNG — Linux/macOSの
/dev/urandom、WindowsのCryptGenRandom、ブラウザのcrypto.getRandomValues()。これらはハードウェア由来のエントロピーで初期化された、暗号学的に安全な擬似乱数生成器(CSPRNG)です。 - サイコロ — カジノ品質のサイコロを使い、出目をビット列や単語インデックスに対応付けて手動でエントロピーを作るユーザーもいます。これにより、ソフトウェアやハードウェアのRNGを信頼する必要を減らせます。
ステップ2: チェックサム計算
エントロピーが生成されたら、チェックサムを追加します。
- エントロピーバイト列のSHA-256ハッシュを計算する。
- ハッシュ先頭
ENT / 32ビットを取り出す(ENTはエントロピー長・ビット単位)。 - これらのチェックサムビットをエントロピー末尾に付加する。
256ビットのエントロピーでは、8ビットのチェックサムが追加され、合計264ビットになります。
チェックサムは誤り検出機構です。復元時にシードフレーズをウォレットへ入力すると、ウォレットはチェックサムを再計算します。単語が間違っていたり順序が違っていたりするとチェックサム検証に失敗し、ニーモニックは拒否されます。これは転記ミスの検出には有効ですが、訂正はしません。
チェックサムの含意
ニーモニックの最後の単語はチェックサムビットを含むため、与えられた単語列に対して最後の単語として有効な候補は限られます。24語ニーモニックでは、最後の単語はエントロピー3ビットとチェックサム8ビットを符号化するため、先頭23語が固定されたとき有効なのは2,048語中8語だけです。つまり最後の単語は自由に選べません。
ステップ3: 単語へのマッピング
結合したエントロピー+チェックサムのビット列を11ビットずつに分割します。各11ビットは0〜2,047のインデックスとなり、BIP-39単語リストの単語に対応します。
264 bits / 11 bits per word = 24 words
132 bits / 11 bits per word = 12 words
英語単語リスト
BIP-39英語単語リストは、ちょうど2,048語です。次の特性を満たすよう慎重に設計されています。
- 先頭4文字の一意性 — どの2語も先頭4文字が重複しません。たとえば
abandonはabanで一意に識別でき、コンパクトな金属バックアップに有用です。 - 一般的な語彙 — 単語はシンプルで広く知られた英単語です。専門用語、固有名詞、難解な語は避けられています。
- 類似語の回避 — 混同しやすい語(例: "woman" と "women")は可能な限り除外されています。
- 文字数 — すべての単語は3〜8文字です。
他言語の単語リスト
BIP-39は9言語の単語リストを定義しています。
| Language | Status | Notes |
|---|---|---|
| English | Reference standard | Most widely supported |
| Japanese | Standardized | Uses katakana; spaces are ideographic (U+3000) |
| Korean | Standardized | |
| Spanish | Standardized | |
| Chinese (Simplified) | Standardized | |
| Chinese (Traditional) | Standardized | |
| French | Standardized | |
| Italian | Standardized | |
| Czech | Standardized | |
| Portuguese | Standardized |
重要な互換性注意: ある単語リストで生成したニーモニックは、別言語の単語リストでは復元できません。言語間で単語インデックスが異なるためです。バックアップ作成時に使用した言語は必ず記録してください。
ステップ4: シード導出(PBKDF2)
ニーモニック文は暗号鍵として直接使いません。代わりにPBKDF2-HMAC-SHA512で鍵ストレッチを行います。
PBKDF2(
password = mnemonic sentence (words joined by spaces, normalized to UTF-8 NFKD),
salt = "mnemonic" + optional_passphrase,
iterations = 2048,
key_length = 512 bits
)
これにより512ビットのシードが得られ、BIP-32階層的決定論的鍵導出の入力になります。
BIP-39におけるPBKDF2の主要特性
鍵ストレッチ — PBKDF2の2,048反復は総当たり攻撃の計算コストを増やします。2,048反復は現代のパスワードハッシュ基準では控えめですが、主要な安全性は鍵ストレッチ係数ではなくニーモニック自体のエントロピー(128または256ビット)にあります。
パスフレーズ対応 — ソルトには任意のパスフレーズ("25th word")を含められます。パスフレーズがなければソルトは単に"mnemonic"です。パスフレーズがある場合は"mnemonic" + passphraseになります。つまり同じニーモニックでも、異なるパスフレーズごとに完全に異なるシード、ひいては異なる鍵とアドレスが生成されます。
パスフレーズの検証なし — ニーモニックチェックサムと異なり、パスフレーズにはチェックサムがありません。どんな文字列でも有効です。間違ったパスフレーズを入力してもエラーは出ず、別の(空の)ウォレットが静かに生成されます。これはもっともらしい否認性には有用ですが、パスフレーズを忘れたユーザーには危険です。
Unicode正規化 — ニーモニックとパスフレーズはPBKDF2に渡す前にUTF-8 NFKD(Normalization Form Compatibility Decomposition)で正規化されます。これにより、OS内部の文字表現差があっても実装間で一貫したシード導出が保証されます。
ステップ5: シードから鍵へ(BIP-32)
PBKDF2で得た512ビットシードはBIP-32(Hierarchical Deterministic Wallets)の入力になります。
- シードをキー"Bitcoin seed"でHMAC-SHA512に通す。
- 左側256ビットがマスター秘密鍵になる。
- 右側256ビットがマスターチェーンコードになる。
- これらを合わせてマスター拡張秘密鍵(xprv)を構成する。
ここから先は、BIP-44 derivation pathsがコイン別鍵とアドレスを導出する標準化ツリー構造を定義します。
具体例
128ビットエントロピー(12語ニーモニック)を使った簡略例でBIP-39を追ってみます。
1. 128ビットのエントロピーを生成
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
(これはすべて0のエントロピーで、説明用のみです。実運用では絶対に使わないでください。)
2. SHA-256ハッシュを計算
SHA256(0x00000000000000000000000000000000) = 374708fff7719dd5979ec875d56cd2286f6d3cf7ec317a3b25632aab28ec37bb
3. ハッシュ先頭4ビットをチェックサムとして取得
先頭バイト: 0x37 = 00110111。先頭4ビット: 0011。
4. チェックサムをエントロピーに付加
128ビットの0 + 0011 = 合計132ビット。
5. 11ビットごとに分割
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000011 → 3 → "about"
結果: abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
これは全0エントロピーで有名なテストベクトルです。最後の単語が"abandon"ではなく"about"なのは、チェックサムビットのためです。
6. PBKDF2でシード導出
PBKDF2("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", "mnemonic", 2048, 64)
これにより、BIP-32導出に使う512ビットシードが生成されます。
SafeSeed Seed Phrase Generator を使ってBIP-39の動作を確認できます。シードフレーズを生成し、エントロピー、チェックサム、単語マッピングをリアルタイムで表示できます。最大の安全性のためにオフラインで実行してください。
BIP-39のセキュリティ分析
エントロピーの安全性
24語ニーモニック(256ビットエントロピー)の場合:
- 探索空間は2^256(約1.16 x 10^77通り)。
- 1秒あたり1兆(10^12)回試行しても、総当たり探索には約3.67 x 10^57年かかり、宇宙年齢(1.38 x 10^10年)をはるかに超えます。
12語ニーモニック(128ビットエントロピー)の場合:
- 探索空間は2^128(約3.4 x 10^38通り)。
- 1秒あたり1兆回試行で、総当たり探索には約10^19年かかります。
いずれも古典計算では現実的に不可能です。
PBKDF2に関する考慮事項
2,048反復のPBKDF2は総当たり攻撃に一定係数のコストを追加しますが、主要な防壁ではありません。Argon2やbcryptなど現代的な鍵導出関数と比べると2,048反復は低いと指摘する研究者もいます。ただし支配的要因はニーモニックエントロピー(128または256ビット)であるため、実運用では大きな懸念ではありません。
チェックサムの限界
チェックサムは多くの転記ミスを検出しますが:
- エラーを検出するだけで訂正はしません。
- 12語ニーモニックではチェックサムが4ビットしかないため、ランダム改変の約16回に1回はチェックサムを通過します。
- たまたま有効なチェックサムになる単語並べ替えは防げません。
パスフレーズのリスク
パスフレーズ機能は強力ですが、リスクもあります。
- パスフレーズを忘れると資金は復旧不可能です(「リセット」機構なし)。
- パスフレーズは検証されません。任意文字列で有効ウォレットが生成されます。
- 攻撃者がニーモニックのみ入手しパスフレーズを知らない場合、パスフレーズを総当たりする必要があり、パスフレーズエントロピーに応じた追加防御になります。
BIP-39への批判
BIP-39はBitcoin開発コミュニティ内でも批判がないわけではありません。
バージョニングなし
BIP-39にはバージョンバイトがなく、導出プロセスは将来にわたり固定されます。将来、別の鍵導出関数やパラメータが必要になっても、ニーモニック形式内でそれを示せません。これが、一部ウォレット(特にElectrum)が独自のバージョニング付きニーモニックスキームを使う理由です。
単語リストへの強い依存
ニーモニックは厳密に単語リストへ依存します。仮に単語リストが変更されると既存ニーモニックは復元不能になります。標準化以降リストは凍結されていますが、この柔軟性の低さは設計上の制約と見なされています。
弱い鍵ストレッチ
前述の通り、PBKDF2の2,048反復は現代基準では弱いとされます。高エントロピーニーモニックでは安全性への実質影響は小さいものの、短いパスフレーズやユーザー任意パスフレーズでは保護が弱くなります。
Electrumの代替方式
Electrumウォレットは、バージョニングを含み固定単語リストに依存しない独自ニーモニックスキームを使用します。ElectrumニーモニックはBIP-39互換ではありません。つまりElectrumのシードフレーズはBIP-39ウォレットで復元できず、その逆も同様です。ウォレットがどの標準を使うか必ず確認してください。
BIP-39実装
BIP-39はほぼすべての主要ウォレットで実装されています。
| Wallet | BIP-39 | Word Count | Notes |
|---|---|---|---|
| Ledger | Yes | 24 | Hardware, secure element |
| Trezor | Yes | 12/24 | Also supports SLIP-39 (Shamir) |
| Coldcard | Yes | 24 | Bitcoin-only hardware |
| MetaMask | Yes | 12 | Browser extension |
| Trust Wallet | Yes | 12 | Mobile |
| Exodus | Yes | 12 | Desktop/mobile |
| Electrum | No | 12 | Uses own scheme |
| BlueWallet | Yes | 12/24 | Bitcoin-focused mobile |
テストと検証
公式テストベクトル
BIP-39仕様にはテストベクトル(既知のエントロピー値と対応するニーモニック単語、および導出シード)が含まれます。実装が正しいことを検証するために使われます。
ウォレットのBIP-39実装は、次の公式テストベクトルと照合して確認できます。
シードフレーズの検証方法
シードフレーズを正しく記録できているか確認する手順:
- ハードウェアウォレットでシードフレーズを生成する。
- 慎重に書き留める。
- ハードウェアウォレットを工場出荷状態にリセットする。
- 書き留めたシードフレーズで復元する。
- 同じアドレスが生成されることを確認する。
- ウォレットがトランザクションに署名できることを確認する。
この手順により、バックアップが正しいことと、ウォレットのBIP-39実装が期待通り動くことの両方を確認できます。
FAQ
BIP-39は何の略ですか?
BIPはBitcoin Improvement Proposalの略です。BIP-39は提案39番で、暗号学的エントロピーのニーモニック(人が読める)表現を作る標準を定義します。2013年に導入され、ほぼすべての主要暗号資産ウォレットに採用されています。
12語のシードフレーズはすべてBIP-39ですか?
いいえ。いくつかのウォレット(特にElectrum)はBIP-39とは異なる独自ニーモニックスキームを使います。どちらも単語リスト由来の12語を生成しますが、エンコード、単語リスト、導出プロセスが異なります。BIP-39フレーズはElectrum方式では使えず、その逆も同様です。必ずウォレットのドキュメントを確認してください。
単語を選んで自分でBIP-39シードフレーズを作れますか?
推奨されません。技術的には23語を選んで有効な24語目(チェックサムを満たす)を計算できますが、人間の単語選択は十分なエントロピーを生みません。BIP-39の安全性は、人間の選択ではなく高品質なランダムデータから単語が導かれることに依存します。エントロピー生成はCSPRNGに任せてください。
PBKDF2のsaltに"mnemonic"が使われる理由は?
文字列"mnemonic"はBIP-39で規定された固定saltです。パスフレーズ使用時はこのsaltに連結されます(例: "mnemonicMyPassphrase")。既知の固定saltを使うことで、ニーモニックと任意パスフレーズ以外の追加情報なしに、すべての実装で一貫したシード導出が可能になります。
BIP-39はBitcoin専用ですか?
いいえ。BIP-39はEthereum、Litecoin、Cardano、Solanaなどを含む、ほぼすべての主要暗号資産で使われています。ニーモニック生成とシード導出のプロセスは同一で、その後の鍵導出パス(BIP-44コインタイプで定義)がチェーンごとに異なるだけです。
BIP-39とSLIP-39の違いは?
BIP-39は秘密全体を表す単一ニーモニックを生成します。SLIP-39(Satoshi Labs Improvement Proposal 39)はShamir's Secret Sharingを実装し、秘密を複数シェア(例: 5分割のうち3つで復元)に分割します。しきい値数のシェアがあれば秘密を復元でき、しきい値未満では情報は得られません。SLIP-39はBIP-39と異なる単語リストとエンコードを使います。
有効なBIP-39ニーモニックは何通りありますか?
24語ニーモニックは2^256(約1.16 x 10^77)。12語ニーモニックは2^128(約3.4 x 10^38)。これらはエントロピー空間を表します。チェックサムは単語組み合わせを制約しますがエントロピー自体は減らしません。つまり、BIP-39の24語をランダムに並べたすべてが有効ニーモニックになるわけではありません。