# [BIP39] 単語でウォレットを復元する仕組みを理解しよう！

> BIP39は、「ニーモニックコード」あるいは「ニーモニックセンテンス」と呼ばれる仕組みを導入しています。これは、ある種の意味を持った単語の列（英単語など）を使って、人間にとって記憶しやすくしたウォレット復元用の情報を表現する手法です。

- URL: https://cardene.dev/articles/58f7c40a8441cadc608f
- 公開日: 2025-08-09
- 更新日: 2025-08-09
- トピック: Blockchain
- タグ: ethereum, solidity, smartcontract, ブロックチェーン

## はじめに

『DApps開発入門』という本や色々記事を書いているかるでねです。

https://amzn.asia/d/gxvJ0Pw

今回は、人が記録・管理しやすいように、ランダムな秘密鍵情報を意味のある単語の並び（ニーモニック）に変換することで、安全かつ簡単に暗号資産ウォレットを復元できる仕組みを提案している**BIP39**についてまとめていきます！

:::message
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
:::

https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki

他に様々なEIPについてまとめています。

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

## 概要

**BIP39**は、「**ニーモニックコード**」あるいは「**ニーモニックセンテンス**」と呼ばれる仕組みを導入しています。
これは、ある種の意味を持った単語の列（英単語など）を使って、人間にとって記憶しやすくしたウォレット復元用の情報を表現する手法です。

ニーモニックセンテンスは、完全にランダムに生成されたバイナリデータ（つまりシード）をわかりやすい単語列に変換したものです。
この変換は2つのステップから構成されます。

1つ目は、ランダムなエントロピー（情報のかたまり）をもとに単語列を生成すること。
2つ目は、その単語列から「**バイナリ形式のシード（種）**」を生成することです。
このシードは、**BIP32**などの方式により、階層的な決定論的ウォレット（HDウォレット）を導く鍵のもとになります。

このように、ニーモニックコードは「**記憶しやすいが高セキュリティな表現**」であり、最終的には暗号資産のウォレットの秘密鍵の生成に用いられます。

## 動機

従来、暗号資産のウォレットを安全に管理するためには、長く複雑なバイナリデータや16進数文字列を取り扱う必要がありました。
しかし、それは人間にとって扱いづらく、紙に書き写すにも間違いが起きやすく、電話で伝えることも困難でした。

**BIP39**では、ランダムに生成された情報を「**単語列**」という人間にとって親しみやすく、記録・伝達しやすい形式に変換する方法を標準化しています。
例えば、12個または24個の英単語を紙に書いておけば、後からそれをもとに同じウォレットを復元することが可能です。

注意すべき点として、この仕組みは「**人間が思いついた文章**」を入力としてウォレットを作成する、いわゆる「**ブレインウォレット**」のような使い方を意図していません。
あくまでもコンピュータが生成したランダム性を、人間が記録しやすい形に変換するための仕組みです。

このように、ニーモニックコードは「**安全性**」、「**ユーザビリティ**」、「**可搬性**」のバランスを取るための技術であり、暗号資産利用の基礎を支える重要な考え方です。

### ニーモニックの生成方法（Generating the mnemonic）

ニーモニックセンテンスの生成は、以下のようなステップで行われます。

1. 指定されたビット数（128〜256ビット）のランダムなエントロピー（乱数）を生成します。
2. そのエントロピーのSHA-256ハッシュをとり、先頭の `ENT / 32` ビットをチェックサムとして取得します。
3. 元のエントロピーとチェックサムを結合し、11ビットずつのグループに分けます。
4. 各11ビットのグループを0〜2047の数値として扱い、2048語からなる単語リストから単語を選び出します。
5. 得られた単語列を、最終的なニーモニックセンテンスとして使用します。

例えば、128ビットのエントロピーを使うと、4ビットのチェックサムが追加され、132ビットになります。
これを11ビットずつに分割すると12個の単語が得られます。
以下の表に、エントロピーと単語数の関係が示されています。

| エントロピー（ビット） | チェックサム（ビット） | 単語数 |
| ----------- | ----------- | --- |
| 128         | 4           | 12  |
| 160         | 5           | 15  |
| 192         | 6           | 18  |
| 224         | 7           | 21  |
| 256         | 8           | 24  |

### 単語リスト（Wordlist）の特徴

ニーモニックコードの正確さと使いやすさを支えるのが、単語リストの品質です。
このリストには以下の特徴が求められます。

* **前方一致による識別性**
    * 各単語の先頭4文字だけで他の単語と区別できるように設計されています。
* **似た単語の排除**
    * 例えば「quick」と「quickly」のように、記憶や入力で混乱しやすい単語は除外されています。
* **整列された構造**
    * リストはソートされており、探索が高速にできるよう工夫されています。
    * 例えばバイナリサーチやトライ木（prefix tree）を使った最適化が可能です。

単語リストはUTF-8（NFKD）形式でエンコードされている必要があります。

### ニーモニックからシードへの変換（From mnemonic to seed）

得られたニーモニックセンテンスは、秘密鍵生成の元となる「**シード**」に変換されます。
この変換では、任意のパスフレーズを追加することも可能で、セキュリティ強化のために推奨されます。

変換処理には以下の方法が用いられます。

* 入力となるニーモニックセンテンスとパスフレーズをUTF-8（NFKD）でエンコードします。
* パスワードにはニーモニックセンテンス、ソルトには「`mnemonic` + パスフレーズ」を使用します。
* 鍵導出関数にはPBKDF2（HMAC-SHA512）を使用し、2048回の反復で512ビット（64バイト）のシードを得ます。

このシードは、**BIP32**などの仕様に沿って、階層的な決定論的ウォレット（HDウォレット）を構築するために使われます。

この変換処理は「**ニーモニックの生成**」とは独立しており、実装上も分離されたシンプルな設計になっています。
そのため、開発者は任意の単語リストや変換方式を使うことが可能です。
ただし、生成規則に従わないニーモニックを使用する場合、チェックサムを検証し、無効な場合には警告を出すことが推奨されています。

また、この方式は多重の秘密保持も可能にします。
異なるパスフレーズを与えると、すべて有効なシードが生成されるため、意図しない第三者が正しいパスフレーズを知らなければ目的のウォレットに到達できません。

### 推奨される単語リスト（Wordlists）

**BIP39**に対応した多くのウォレットは英語の単語リストのみに対応しています。
そのため、英語以外のローカライズされたリストでニーモニックを生成することは強く推奨されません。

どうしても別の言語を使用する必要がある場合は、公式に定義されたローカライズ単語リスト（BIP39 Wordlists）を使用するべきです。
独自に単語リストを作成することは避けてください。

## 引用

This BIP falls under the MIT License.

## 最後に

今回は「人が記録・管理しやすいように、ランダムな秘密鍵情報を意味のある単語の並び（ニーモニック）に変換することで、安全かつ簡単に暗号資産ウォレットを復元できる仕組みを提案している**BIP39**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください！

[Twitter @cardene777](https://twitter.com/cardene777)

他の媒体でも情報発信しているのでぜひ他も見ていってください！

https://chaldene.net/

https://zenn.dev/heku

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4
