BIP-39仕様では主に、ニーモニック(覚えやすい単語のセット)に基づいて決定論的なウォレットを生成するためのアルゴリズムとプロセスについて説明します。
仕様は 2 つの主要な部分で構成されます。
ニーモニックの生成方法。
生成されたニーモニックをバイナリ シードに変換する方法。
以下では、最初にこれら 2 つの部分のそれぞれについて説明することにより、決定論的なウォレットを生成する方法を説明します。
ニーモニックの生成
ニーモニックを生成するアルゴリズム プロセスは次のとおりです。
プロセスは次のとおりです。
128 ~ 256 ビットのランダム シーケンス (エントロピー) を作成します (ステップ サイズ 32 ビット)。
前のステップで生成されたランダム シーケンスに対して SHA256 を実行してハッシュ値を生成し、ハッシュ値の最初の N ビット (エントロピー長 / 32、たとえば 128 ビットの場合、N = 4) をランダム シーケンスのチェックサムとして取得します。
最初のステップで生成されたランダム シーケンスの最後にチェックサムを追加します。これにより、図の例では、チェックサムを含むランダム シーケンスは 128 + 4 = 132 ビットになります。
前のステップからのランダム シーケンスを 11 ビット セグメント (分割) で分離します。これにより、128 ビット エントロピー長のシーケンスの場合、12 個のセグメントが生成されます (132 / 11 = 12)。
この時点で、11 ビット セグメントを含む各値が 2048 ワードの事前定義された辞書にマッピングされます。
カットの順序で生成された最後の単語グループがニーモニックです。
ニーモニックからのシード生成
ニーモニックの生成後、キー生成関数 PBKDF2 アルゴリズムを使用してシードを生成できます。
PBKDF2 には、ニーモニックとソルトという 2 つのパラメータが必要です。ソルトの目的はクラッキングをより困難にすることであり、BIP-39 ではシードを保護するための追加のセキュリティ要素としてパスフレーズを導入できます。
「PBKDF2 は、RSA Laboratories の公開鍵暗号化標準 (PKCS) シリーズの一部です。 具体的には、PKCS #5 v2.0 (インターネット エンジニアリング タスク フォースの RFC 2898 としても公開されています)。
上記のニーモニック生成に続いて、次の図はシード生成のアルゴリズムを示します。
PBKDF2 の最初のパラメータは、上記で生成されたニーモニックです。
PBKDF2 の 2 番目のパラメーターはソルトで、通常は文字列と、ユーザーが指定した暗号文字列のオプションの連結で構成されます。
PBKDF2 は、2048 ハッシュを使用して 512 ビット値をシードとして生成する HMAC-SHA512 アルゴリズムを使用します。
シードから HD ウォレットを生成
上記で生成されたシードは HD ウォレットのルート シードとして使用され、任意の HD ウォレットのルート シードで HD ウォレット全体を再作成できます。
ルート シードを HMAC-SHA512 アルゴリズムに入力すると、512 ビットのハッシュが生成され、その左側の 256 ビットがマスター秘密キーとして使用され、右側の 256 ビットがマスター チェーン コードとして使用されます。その後、マスター秘密鍵 m からマスター公開鍵 (264 ビット) を生成できます。
上の図からわかるように、HD キーは次のパラメータで生成されます。
親秘密鍵または親公開鍵。 (両方とも非圧縮 256 ビット ECDSA キーです)。
256 ビットの親チェーン コード。
32 ビット整数のインデックス番号。
さらに、上記のプロセスは再帰的であり、図内の 子の秘密キー は、次のレベルで 親秘密キー として使用できます。
HMAC-SHA512 アルゴリズムに (親公開キー、親チェーン コード、インデックス番号) を入力すると、そのサブキーを生成でき、インデックス番号を調整して同じレベルで複数のサブキーを生成できます。
拡張キーについて
この鍵導出関数は一方向であるため、すべてのサブ鍵を使用して同じレベルの親鍵または姉妹鍵を導出することはできません。すべてのサブ鍵およびサブチェーン・コードを導出するために使用できるのは、親鍵および親チェーン・コード (親の親レベルの鍵およびチェーン・コードから生成される) のみです。その後、トランザクションに署名するための対応するサブ公開鍵およびアドレスが生成されます。
キーとチェーンコードの組み合わせは拡張キーと呼ばれ、拡張キーを使用してそれ以降のすべての分岐を生成できます。
拡張キーで提供されるキーは、秘密キーまたは公開キーのいずれかで、それぞれ 拡張秘密キー および 拡張公開キー と呼ばれるチェーン コードと組み合わせられ、それぞれ (k, c) および (K, c) として表されます。ここで、公開キー K = point(k) です。
拡張秘密鍵から拡張公開鍵を導出できますが、その逆はできません。そのため、一部のトランザクション シナリオ (電子商取引など) では、支払いを受け取るためにトランザクションごとに新しい公開鍵とアドレスを生成できます。一方、拡張秘密鍵は、トランザクションの安全なオフライン署名のためにペーパー ウォレットまたはハードウェア ウォレットに保存できます。ご覧のとおり、拡張公開キーのセキュリティは比較的高く、次の図は、子の秘密キーを導出し、子公開キーを生成するための拡張親公開キーの送信メカニズムを示しています。




