Password-Based Key Derivation Function 2 は、入力、ソルト、反復回数、疑似乱数関数、出力長をパラメーターとする決定的な導出関数です。BIP39 が定めるのは特定の PBKDF2-HMAC-SHA512 構成であり、PBKDF2 の全用途ではありません。
password と呼ばれる入力は UTF-8 NFKD の単語フレーズです。ソルトは mnemonic + passphrase で、同じく UTF-8 NFKD を使い、passphrase がなければ空の値を追加します。BIP39 は HMAC-SHA512、2048 回の反復、64 バイトつまり 512 ビットの出力を指定します。 [BIP39 — Mnemonic generation and seed conversion]
PBKDF2 はパスワード入力、ソルト、出力ブロックの索引から最初の中間結果を作ります。以降は同じ疑似乱数関数を前の結果に適用し、得た値を XOR で結合します。HMAC-SHA512 のブロックは 64 バイトなので BIP39 は一つのブロックを使います。テキストに SHA-512 を単に 2048 回適用するだけでは不十分です。 [RFC8018 — PBKDF2 construction] [BIP39 — Mnemonic generation and seed conversion]
正規化後の入力とパラメーターが同じなら seed も同じです。復元時に 2048 回の反復を勝手に増やしたり関数を変えたりしても、既存ウォレットの安全性向上にはなりません。結果が BIP39 の規定の導出と一致しなくなるためです。別の単語リストへの翻訳も中立な変更ではありません。 [BIP39 — Mnemonic generation and seed conversion]
反復は一回の試行に必要な仕事を増やしますが、独立した秘密のランダム性は追加しません。単語とウォレットの照合データを持つ攻撃者は弱い passphrase をオフラインで試せます。したがって 512 ビット出力は 512 ビットのエントロピー相当の保護を意味せず、2048 は新しいシステムへの普遍的な推奨値でもありません。 [RFC8018 — PBKDF2 construction] [BIP39 — Mnemonic generation and seed conversion]
BIP39 checksum は使用前の単語の誤り検出を助けます。PBKDF2 変換自体はフレーズ生成や検査と別であり、passphrase が探しているウォレットに属することを証明しません。その後 BIP32 などの決定的な方法が次の段階で seed を使用できます。 [BIP39 — Mnemonic generation and seed conversion]
公開 BIP39 テストベクトルにはエントロピー、単語、テスト用 passphrase TREZOR による期待 seed が示されています。正しい実装は出力全体を再現し NFKD に従う必要があります。これら既知の入力を資金用の自分のバックアップにしてはいけません。テストの一致だけでアプリ全体の安全性が確認されるわけでもありません。 [BIP39 — Mnemonic generation and seed conversion]
理解を深めるには、この項目とあわせて次もお読みください BIP 39, BIP39 passphrase, Seed Generation, HD Wallet. 次の項目からも参照されています BIP39 passphrase.