BIP 39 — 決定性鍵生成のためのニーモニックコード

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