一般的な BIP39 の手順では、乱数データをバックアップ用の単語列、つまり Seed Phrase に変換します。その単語列と任意の passphrase(追加のパスワード)からシードが得られます。シードは、BIP32 がウォレットの鍵の木を導出するための秘密データです。乱数、単語列、シード、鍵は同じ道筋の別々の段階であり、ほかのバックアップ形式では手順が異なることもあります。
覚えやすいバックアップにしようと、好きな本から単語を選ぶ場面を想像してください。自分には珍しい組み合わせに思えても、攻撃者は引用文や人間が好むパターンを狙って試せます。そのため BIP39 はコンピューターが生成した乱数から始め、それを後から単語で表します。その予測の難しさを表すのがエントロピーです。単語列は秘密データを読みやすく記録するもので、自分の文章を作るためのものではありません。 [1]
ウォレットは、適切な名前の関数を呼ぶだけでなく、実際に乱数データを取得しなければなりません。たとえば Linux の getrandom() は、標準設定ではシステムの乱数源が準備できるまで待ちます。GRND_NONBLOCK を指定すると、待たずに EAGAIN を返すことがあります。これはデータがまだ利用できないという意味です。プログラムは結果と、取得できたデータの単位であるバイト数を確認する必要があります。失敗後も秘密の入力を作れたものとして続行すると、一見動くものの安全ではないウォレットを作るおそれがあります。 [2]
ブラウザーにも安全な乱数データを得るためのインターフェースがあります。Web Crypto getRandomValues() は整数配列を暗号学的に安全なバイトで埋め、65536 バイトを超える要求には QuotaExceededError を返します。ただし、これは一つの関数の性質であって、サイト全体の安全性の証明ではありません。良い乱数を得たページが、その後バックアップの単語を漏らす可能性もあります。読み込まれたコードと、結果の扱い方も調べる必要があります。 [3]
単語を書き間違えた場合、ウォレットはチェックサムで誤りを検出できることがあります。これは元のデータから計算する短い確認用データです。BIP39 は 128 ビットの入力に 4 ビットのチェックサムを加えて 12 語にし、256 ビットに 8 ビットを加えて 24 語にします。ビットは情報の基本単位です。チェック用のビットは SHA256 が計算したデータの指紋に由来し、新しい独立したエントロピーではありません。したがって、有効なチェックサムは単語の秘密保持や安全な生成を証明しません。 [1]
単語はバックアップに便利ですが、ソフトウェアには厳密に定められたデータへの変換が必要です。BIP39 は導出関数 PBKDF2-HMAC-SHA512 を 2048 回反復し、512 ビットのシードを作ります。単語列に加え、salt というパラメーターを使います。ここでは固定の文字列 mnemonic の後ろに passphrase を続け、使わない場合は空文字列を続けます。単語列とこのパラメーターは、文字の表現を統一する UTF-8 NFKD で処理されます。出力が長くなっても不足する乱数は生まれず、その長さは入力に 512 ビットのエントロピーがある証拠にはなりません。 [1]
次の段階を定めるのが BIP32 です。シードからマスター秘密鍵と chain code を導出します。後者はさらに別の鍵を導出するための補助データです。これにより、ウォレットは共通の出発点から新しいアドレスを作れます。技術的には、固定文字列 Bitcoin seed を HMAC-SHA512 の鍵として処理し、その結果を分割します。この公開文字列はあなたの秘密ではありません。導出された秘密鍵がゼロや許容範囲外なら無効です。シードを単に秘密鍵と呼び替えるわけではありません。 [4]
開発者はプログラムが正しく計算するか確かめる必要があります。テストベクトルは、そのための既知の入力と期待される出力の組です。BIP39 はエントロピー、単語列、シードを含む組を公開し、テスト用 passphrase TREZOR を使います。結果の一致は、その入力の変換を確認するものです。実際の生成器が予測困難な秘密を作れるかまでは分かりません。テストデータは公開されているため、実際の資金を守る秘密のバックアップには使えません。 [1]
乱数源、単語列、保管するバックアップの間には複数の段階があります。NIST SP 800-90C は、エントロピー源と乱数データの生成機構を組み合わせる方法を示します。ウォレットを評価するには、具体的なソフトウェアの版、エラー処理、段階間のデータの受け渡しも確認しなければなりません。十分に検証された部品があっても、別の部品が秘密を失ったり漏らしたりしない保証にはなりません。必要なのは信頼できそうな名前を一つ探すことではなく、全工程を追うことです。 [5]
理解を深めるには、この項目とあわせて次もお読みください Random Number Generator, BIP 39, HD Wallet, Seed Phrase. 次の項目からも参照されています Random Number Generator, CSPRNG, Deterministic RNG, Entropy Mixing.