BIP-39仕様は、ヘルパーワード(覚えやすい単語の集合)をもとに、決定論的な財布を生成するアルゴリズムとプロセスを記述しています。
仕様書は大きく2つの部分から構成されています。
- ヘルパーワードの生成方法
- 生成されたヘルパー語をどのようにバイナリシードに変換するか。
以下、この2つのパーツそれぞれから、決定論的なウォレットを生成する方法について見ていきます。
ニモニックの生成
ニモニックを生成するためのアルゴリズムプロセスを以下に示す。
手順は以下の通りです。
- 128~256ビット(32ビットステップ)のランダムな配列を作成(エントロピー)。
- 前の手順で生成した乱数列に対してSHA256を実行してハッシュ値を生成し、ハッシュ値の最初のNビット(エントロピー長/32、例えば128ビット、N=4)を乱数列のチェックサムとする。
- 第1ステップで生成した乱数列の末尾にChecksumを付加し、図の例ではChecksum付加後の乱数列は128 + 4 = 132ビットとなります。
- 128ビットのエントロピーを持つシーケンスに対して、12個のセグメントが生成されるように、前のステップからの乱数シーケンスを11ビットのセグメントで分離する(132/11 = 12)。
- 11ビットのセグメントを含む各値は、あらかじめ定義された2048語の辞書にマッピングされます。
- は、切り出し順で生成される最後の単語群がヘルパーワードである。
ニーモニックからのシード生成
トークンの生成後、鍵生成関数 PBKDF2 アルゴリズムを用いてシードを生成することができます。
PBKDF 2はトークンとソルトの2つのパラメータを取る。ソルトの目的はクラッキングを困難にすることであり、BIP-39ではシードを保護するための追加のセキュリティ要素としてパスフレーズを導入することが可能である。
PBKDF2は、RSA研究所の公開鍵暗号方式標準(PKCS)シリーズ、特にPKCS #5 v2.0、として公開されているものである。Internet Engineering Task ForceのRFC2898。
上記のニモニック生成に続き、下図にシード生成のアルゴリズムを示す。
- PBKDF2の第一引数は、上記の生成されたニーモニックである。
- PBKDF2の第2パラメータはソルトであり、一般に、ユーザーが提供するオプションのパスワード文字列を連結した文字列から構成される。
- PBKDF2はHMAC-SHA512アルゴリズムを使用しており、2048個のハッシュを使用して512ビットの値をシードとして生成しています。
シードからHDウォレットを生成する
そして、上記で生成されたシードをHDウォレットのルートシードとして使用し、任意のHDウォレットのルートシードでHDウォレット全体を再作成することが可能です。
ルートシードはHMAC-SHA512アルゴリズムに投入され、512ビットのハッシュを得る。そのうちの左256ビットがマスター秘密鍵として、右256ビットがマスターチェーンコードとして使用される。そして、マスター秘密鍵mからマスター公開鍵(264ビット)を生成することができる。
上図からわかるように、HDキーは以下のパラメータで生成されます。
- 親の秘密鍵 または 親公開鍵(いずれも256ビットのECDSA鍵を展開したもの)。
- 256ビットの 親チェーンコードまたは
- 32ビット整数 しすう(インデックス番号)です。
また、上記の処理は再帰的であり、図のような 子供の秘密鍵 は、その次のレベルとして使用することができます。 親の秘密鍵.
HMAC-SHA512アルゴリズムに(親公開鍵、親チェーンコード、インデックス番号)を入力することで、その子鍵を生成することができ、インデックス番号を調整することで同じレベルの複数の子鍵を生成することも可能です。
Extended Keysについて
鍵の導出機能は一方向であるため、すべてのサブキーはその親鍵の導出には使用できず、また同じレベルの姉妹鍵の導出もできない。親鍵と親チェーンコード(親の親レベルの鍵およびチェーンコードから生成)のみが、すべてのサブキーとサブチェーンコードの導出に使用でき、これらは対応するサブパブリックキーとアドレスとに使用することができる。その後、サブキーとチェーンコードを使用して、トランザクションに署名することができる。
キーとチェーンコードの組み合わせは 拡張キーと呼ばれ 、 そこから下のすべてのブランチを生成するのに使用することができます。
拡張鍵で 提供される鍵は, 秘密鍵でも 公開鍵でもよく,チェーンコードと組み合わせてそれぞれ 拡張秘密鍵 , 拡張公開鍵と呼び,それぞれ(k,c),(K,c)と表記し, 公開鍵K=point(k)である.
拡張秘密 鍵から 拡張公開鍵を導き出すことができ、その逆はできない。そのため、特定の取引シナリオ(例:電子商取引)では、支払いを受ける取引のたびに新しい公開鍵とアドレスを生成し、拡張秘密鍵はペーパーウォレットやハードウェアウォレットに保存して、取引のオフライン署名を安全に行えるようにすることができる。このように拡張 公開鍵は 比較的安全であり、拡張親公開鍵から子秘密鍵を導き出して子公開鍵を生成する転送機構は次の図の通りです。