BIP39 ニーモニック
概要
このBIPでは、決定論的ウォレットを生成するためのニーモニックコードまたはニーモニックセンテンス(覚えやすい単語群)の実装について説明する。
このBIPは、ニーモニックの生成とバイナリシードへの変換の2つの部分から構成される。このシードは後でBIP-0032または同様の方法を使用して決定論的ウォレットを生成するために使用することができます。
動機
ニーモニックコードや文章は、ウォレットシードの生の2進数や16進数表現の取り扱いに比べ、人間との対話に優れている。文章は紙に書いたり、電話で話したりすることができる。
このガイドは、コンピュータが生成したランダム性を人間が読めるように書き写したものを輸送するためのものである。ユーザーが作成した文章(ブレインウォレットとも呼ばれる)をウォレットシードに加工する方法ではありません。
ニーモニックの生成
ニーモニックは32ビットの倍数でエントロピーをエンコードしなければならない。エントロピーが大きいほどセキュリティは向上するが、文の長さは長くなる。最初のエントロピー長をENTと呼ぶ。ENTの許容サイズは128-256ビットである。
まず、ENTビットの初期エントロピーが生成される。チェックサムはSHA256ハッシュの最初のENT / 32ビットを用いて生成される。このチェックサムは初期エントロピーの最後に付加される。次に、これらの連結されたビットは11ビットのグループに分割され、それぞれが0~2047の数字をエンコードし、ワードリストのインデックスとして機能する。最後に、これらの数字を単語に変換し、結合した単語をニーモニック文として使用する。
以下の表は、初期エントロピー長(ENT)、チェックサム長(CS)、生成されたニーモニック文(MS)のワード長との関係を示している。
code: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文字を入力するだけで、その単語を明確に識別できるように作成されている。最初の4文字を入力するだけで、その単語を明確に識別できる。
b) 類似語を避ける
"build "と "built"、"woman "と "women"、"quick "と "quickly "のような単語ペアを避ける。文章を覚えるのが難しくなるだけでなく、間違いが起こりやすい。推測が難しくなる。
c) 並べ替えられた単語リスト
単語リストがソートされているため、より効率的にコード語を検索できる。(すなわち、実装では線形探索の代わりにバイナリ探索を使用できる)。
また、trie(接頭辞ツリー)を使用することもできます。
単語リストにはネイティブ文字を含めることができますが、正規化形式互換分解(NFKD)を使って UTF-8 でエンコードする必要があります。
ニーモニックからシードへ
ユーザーは自分のニーモニックをパスフレーズで保護することができます。パスフレーズがない場合、代わりに空の文字列""が使われます。
ニーモニックからバイナリシードを作成するために、ニーモニック文(UTF-8 NFKD)をパスワードとして、文字列 "mnemonic "+パスフレーズ(これもUTF-8 NFKD)をソルトとして、PBKDF2関数を使用する。反復回数は2048に設定され、擬似ランダム関数としてHMAC-SHA512が使用される。派生鍵の長さは512ビット(=64バイト)である。
このシードは、後でBIP-0032または同様の方法を使用して決定論的なウォレットを生成するために使用することができます。
ニーモニック文のバイナリシードへの変換は、文の生成とは完全に独立している。この結果、かなりシンプルなコードになります。文の構造には制約がなく、クライアントは独自の単語リストや文全体のジェネレータを自由に実装することができます。
ニーモニックの生成」セクションで説明したアルゴリズムによって生成されたものでないニーモニックを使用することは可能であるが、これは推奨されず、ソフトウェアは単語リストを使用してニーモニック文のチェックサムを計算し、それが無効な場合は警告を発行しなければならない。
全てのパスフレーズは有効なシード(従って決定論的なウォレット)を生成するが、正しいものだけが望みのウォレットを利用可能にするので、記述された方法はまたもっともらしい否認可能性を提供する。
単語リスト
BIP39ウォレットの大半は英語の単語リストのみをサポートしているため、ニーモニック文の生成に英語以外の単語リストを使用することは強く推奨されません。
もしあなたのアプリケーションが本当にローカライズされた単語リストを使う必要があると思うのであれば、自分で単語リストを作成するのではなく、以下のいずれかを使ってください。
bitcoinrb
code:mnemonic
require 'bitcoin'
mnemonic = Bitcoin::Mnemonic.new("english")
words = "abandon", "ability", "able", "about", "above", "absent", "absorb", "abstract", "absurd", "abuse", "access", "accident" word_master = File.readlines("lib/bitcoin/mnemonic/wordlist/english.txt").map(&:strip)
words = [
"abandon",
"ability",
"able",
"about",
"above",
"absent",
"absorb",
"abstract",
"absurd",
"abuse",
"access",
"accident",
"account",
"accuse",
"achieve",
"acid",
"acoustic",
"acquire",
"across",
"act",
"action",
"actor",
"actress",
"actual"
]