BIP39 では初期エントロピーが単語列となり、単語列と任意の passphrase からバイナリシードが生成されます。BIP32 はそこからマスター鍵と chain code を導出します。値と手順は交換可能ではなく、別のバックアップ形式では異なる処理もあります。
BIP39 はコンピューターが生成した乱数を読みやすく転記するもので、人が考えた文を扱うためのものではありません。既知の引用文や独自の単語列を選ぶことは、規定の手順でエントロピーを生成することと同等ではありません。 [BIP39 — Mnemonic generation and seed conversion]
Linux getrandom() は標準設定では入力源の初期化を待ちます。GRND_NONBLOCK では待たずに EAGAIN を返す場合があります。実装は状態と返却長を扱う必要があり、読み取り失敗を正常に得た入力として扱ってはいけません。 [Linux getrandom — Initialization and return values]
Web Crypto getRandomValues() は整数配列に暗号学的に安全なバイトを供給し、65536 バイトを超えると QuotaExceededError を送出します。このインターフェースに従うだけで、読み込んだコード、後続処理、単語列の漏えい対策は検証できません。 [W3C Web Crypto — getRandomValues contract]
BIP39 は 128 入力ビットに 4 チェックビットを加えて 12 語、256 ビットには 8 ビットを加えて 24 語にします。追加ビットは SHA256 から得られ、新たな独立エントロピーではありません。 [BIP39 — Mnemonic generation and seed conversion]
BIP39 は PBKDF2-HMAC-SHA512 を 2048 回反復して 512 ビットのシードを導出します。単語列と、文字列 mnemonic に passphrase を加えたソルトを UTF-8 NFKD で使います。passphrase がなければ空文字列で、出力長は入力エントロピーが 512 ビットある証拠ではありません。 [BIP39 — Mnemonic generation and seed conversion]
BIP32 は Bitcoin seed を鍵として HMAC-SHA512 でシードを処理し、結果をマスター秘密鍵と chain code に分割します。鍵がゼロまたは許容範囲外なら無効です。シード全体を直接一つの秘密鍵として使うわけではありません。 [BIP32 — Master key generation]
BIP39 はエントロピー、単語列、シードを含むベクトルを公開し、テスト用 passphrase TREZOR を使います。一致はその入力の変換を確認するもので、実際の生成器の予測困難性を証明しません。公開テスト入力を実資金の秘密バックアップに使ってはいけません。 [BIP39 — Mnemonic generation and seed conversion]
NIST SP 800-90C はエントロピー源と生成機構を結び付けます。ウォレットの評価では、具体的な版、エラー処理、後続処理への値の受け渡しも追う必要があります。一つの部品の証拠だけでは、全工程や後のバックアップ保管の安全性を確認できません。 [NIST SP 800-90C — Random bit generator constructions]
理解を深めるには、この項目とあわせて次もお読みください Random Number Generator, BIP 39, HD Wallet, Seed Phrase. 次の項目からも参照されています Random Number Generator, CSPRNG, Deterministic RNG, Entropy Mixing.