BIP: 39
Layer: Applications
Title: Mnemonic code for generating deterministic keys
Authors: Marek Palatinus <slush@satoshilabs.com>
Pavol Rusnak <stick@satoshilabs.com>
Aaron Voisine <voisine@gmail.com>
Sean Bowe <ewillbefull@gmail.com>
Comments-Summary: Unanimously Discourage for implementation
Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0039
Status: Deployed
Type: Specification
Assigned: 2013-09-10
License: MIT
概要
本BIPは、決定性ウォレットを生成するためのニーモニックコード — すなわち覚えやすい単語の並びからなるニーモニック文 — の実装方式を定める。
本仕様は二つの部分から成る。すなわちニーモニックを生成する処理と、それをバイナリシードへ変換する処理である。生成されたシードは、後段でBIP-0032もしくは同等の手法によって決定性ウォレットの生成に用いることができる。
著作権
本BIPはMITライセンスの下に置かれる。
動機
ウォレットシードを生のバイナリや16進表現のまま扱うのと比べて、ニーモニックコードないし文の形にしておくほうが人間にとって扱いやすい。ニーモニック文は紙に書き写すこともでき、電話で口頭伝達することもできる。
本仕様の目的は、コンピューターが生成した乱数性を人間が読める転記形式で持ち運べるようにすることである。利用者自身が考えた文(いわゆる「ブレインウォレット」)をウォレットシードへ変換する手段ではない。
ニーモニックの生成
ニーモニックは、エントロピーを32ビットの倍数長で符号化しなければならない。エントロピーを増やすほど安全性は向上するが、その分だけ文の語数も増える。初期エントロピーの長さをENTと表記する。ENTに許される大きさは128 〜 256ビットである。
まず、ENTビットの初期エントロピーを生成する。次に、そのSHA256ハッシュの先頭ENT / 32ビットを取り出してチェックサムとし、初期エントロピーの末尾に連結する。続いて、連結されたビット列を11ビットずつのグループに分割する。各11ビットは0 〜 2047の番号を表し、ワードリストへの索引として機能する。最後に、これらの番号を単語に置き換え、連結したものをニーモニック文として用いる。
下表は、初期エントロピー長 (ENT)、チェックサム長 (CS)、生成されるニーモニック文の語数 (MS) の関係を示す。
CS = ENT / 32
MS = (ENT + CS) / 11
| ENT | CS | ENT+CS | MS |
+-------+----+--------+------+
| 128 | 4 | 132 | 12 |
| 160 | 5 | 165 | 15 |
| 192 | 6 | 198 | 18 |
| 224 | 7 | 231 | 21 |
| 256 | 8 | 264 | 24 |
ワードリスト
理想的なワードリストは、次の性質を備える。
a) 単語の周到な選定
- 先頭の4文字を入力するだけで単語を一意に特定できるよう構成されている
b) 類似語の回避
- 「build」と「built」、「woman」と「women」、「quick」と「quickly」のような単語対は、文を記憶しにくくするだけでなく、誤入力や推測ミスを招きやすい
c) ソート済みのワードリスト
- ワードリストはソート済みであり、語句の検索を効率化できる(実装は線形探索ではなく二分探索を用いることができる)
- これによりトライ木(プレフィックスツリー)の利用も可能になり、たとえば圧縮効率の向上に役立つ
ワードリストは各言語固有の文字を含んでよいが、それらは互換性分解の正規化形式(NFKD)を用いてUTF-8で符号化されなければならない。
ニーモニックからシードへ
利用者は自身のニーモニックをパスフレーズで保護することを選択してよい。パスフレーズが指定されない場合は、空文字列 "" が代わりに用いられる。
ニーモニックからバイナリシードを生成する際には、PBKDF2関数を用いる。パスワードにはニーモニック文 (UTF-8 NFKD) を、ソルトには文字列 "mnemonic" とパスフレーズの連結 (同じくUTF-8 NFKD) を与える。反復回数は2048回に設定され、擬似乱数関数としてHMAC-SHA512を用いる。導出される鍵の長さは512ビット (= 64バイト) である。
このシードは、後段でBIP-0032もしくは同等の手法によって決定性ウォレットの生成に用いることができる。
ニーモニック文からバイナリシードへの変換は、ニーモニック文を生成する処理から完全に独立している。このため実装はきわめて単純になる。文の構造に課される制約は存在せず、クライアントは独自のワードリストを実装してもよいし、文そのものの生成器を独自に組んでもよい。これにより、誤入力検出やその他の目的に応じてワードリストの柔軟な構成が可能になる。
「ニーモニックの生成」節に記したアルゴリズム以外の方法でニーモニックを作ることもできるが、これは推奨されない。ソフトウェアはワードリストを用いてニーモニック文のチェックサムを必ず計算し、無効である場合は警告を発しなければならない。
ここに記した方式は、もっともらしい否認可能性 (plausible deniability) も提供する。あらゆるパスフレーズが有効なシード(およびそれに対応する決定性ウォレット)を生成するため、正しいパスフレーズを与えたときにのみ目的のウォレットが利用可能になるからである。
ワードリスト一覧
BIP39対応ウォレットの大多数は英語ワードリストにしか対応していないため、ニーモニック文の生成に非英語のワードリストを用いることは 強く推奨されない。
それでも自身のアプリケーションが現地語ワードリストを必要とすると判断する場合は、独自に作るのではなく以下のいずれかを用いること。
- [[bip-0039/bip-0039-wordlists.md|Wordlists]]
テストベクトル
テストベクトルは、入力エントロピー、ニーモニック、およびシードを含む。すべてのベクトルでパスフレーズには "TREZOR" が用いられている。
https://github.com/trezor/python-mnemonic/blob/master/vectors.json
加えて以下も参照のこと。
https://github.com/bip32JP/bip32JP.github.io/blob/master/test_JP_BIP39.json
(高度に正規化された記号をパスフレーズとして用いる日本語ワードリストのテスト)
参照実装
ワードリストを含む参照実装は以下から入手できる。
http://github.com/trezor/python-mnemonic

