本文へスキップ
buybitcoinsmart

用語集 / ウォレットとカストディ

シード導出

シード導出とは?
シード導出とは、ニーモニック文と任意のパスフレーズから、ウォレットが実際に鍵を作る際の元となる512ビットのシードに変換する一方向関数です。

BIP-39で規定されています。

この関数はHMAC-SHA512を用いたPBKDF2で、背後にある乱数ではなく単語そのものに対して実行されます。BIP-39は反復回数を2,048回、出力を64バイトと定めており、パスフレーズは固定の単語"mnemonic"に付加されてソルトを形成します。この工程では、単語がこれまで有効だったかどうかを一切確認しないため、打ち間違えたフレーズでも整った形式のシードと空のウォレットが得られます。

仕組み

シード導出は2つの入力を受け取り1つの出力を返します。1回の呼び出しで完結し、状態も持たず、単語を生成したものの記憶もありません。ニーモニック文がパスワードになります。ソルトはテキスト"mnemonic"にパスフレーズがあれば末尾に付加したもので、パスフレーズを設定していない場合は空文字列が代わりになります。どちらも先にUnicode NFKD正規化を通すため、フランス語やスペイン語のフレーズに含まれるアクセント付き文字は、どのキーボードで入力されたかにかかわらず同じハッシュになります。

BIP-39は、標準のこの半分がフレーズを生成する半分から「完全に独立している」と述べており、それを是認する調子で書いています。文の構造に制約はなく、クライアントは独自の単語リストや文全体の生成器さえ書いてよいとされています。実務上の読み方はもっと率直です。この関数に意味のない12単語を渡しても、64バイトの完全に使用可能なバイト列が返ります。BIP-39は、ソフトウェアがこの工程の外でチェックサムを計算し、「無効な場合は警告を発する」ことを求めています。拒否ではなく警告であるため、壊れていると告げたばかりのフレーズを復元してしまうツールがあるのです。

背後にあるエントロピーではなく文をハッシュ化することから、2つの帰結が生じます。フレーズを単語ごとに別の言語へ翻訳すると、入力バイトが変わるため、根底の乱数が同じでも全く異なるシードが得られます。そして方向は決して逆になりません。任意のBIP-32シードをBIP-39のフレーズとして書き戻すことはできず、「シードをエクスポートする」と「単語をエクスポートする」が別の要求であるのはそのためです。

どこで見られるか

シード導出が表面化するのは、2つのソフトウェアがどの関数を実行するかで食い違う瞬間です。当サイトでレビューしているTrezor Safe 3とSafe 5のマルチシェアバックアップは、BIP-39ではなくSLIP-39です。1,024単語のリストを10ビットずつ読み、128ビットの秘密には1シェアあたり20単語、256ビットの秘密には33単語になります。これらのシェアはBIP-39のPBKDF2の工程には一切触れません。SLIP-39はBIP-39の著者自身によって置き換えとして公開され、シェアを元に戻せない理由を「the overly coupled design of BIP-0039 and its use of a one-way derivation function」に帰しています。逆方向は機能しますが、どの長さから始めても、得られる各シェアは59単語に固定されます。

当サイトのColdcardのレビューは、導出が利用者のためにできないことを示しています。2021年3月のファームウェア移行により、シード生成がハードウェアではなくソフトウェアの疑似乱数生成器から取得する状態になり、Coinkiteは2026年8月1日に勧告を更新しました。導出自体は決して揺らぎませんでした。弱い秘密を、有効なチェックサムの背後にある整った形式の64バイトのシードに変えてしまい、下流のどのウォレットにもそれに気づく手段はありませんでした。

何のリスクも負わずに関数が動く様子を見るには、BIP-39が公開しているテストベクトルがあります。エントロピー、ニーモニック、結果のシードを並べたもので、すべてのベクトルでパスフレーズ"TREZOR"が使われています。

シード導出vs導出パス

シード導出は、鍵が1つも存在しない前に一度だけ行われます。導出パスはその後、アドレスが必要になるたびに参照されます。この違いが、空に見える復元がどれほど深刻かを決めます。誤ったパスは設定の問題です。スクリプトタイプを変更して再スキャンすれば、残高が現れます。誤ったパスフレーズはシードを変え、その下のツリー全体を変えてしまい、どこかの設定で元に戻すことはできません。

混同しやすい用語

よくある質問

シード導出は単語が有効かどうかを確認しますか?

いいえ、どんなテキストでも受け入れます。BIP-39はチェックサムの確認を導出関数の外に置き、失敗したときにウォレットに警告することだけを求めているため、誤った単語を含むフレーズでも整った形式の64バイトのシードが導出され、空のウォレットが開きます。

翻訳したシードフレーズは同じウォレットを開きますか?

いいえ、別のウォレットが開きます。導出は背後にある乱数ではなく文をハッシュ化するため、英語の単語をスペイン語や日本語の相当語に置き換えると入力バイトが変わり、それに続くすべての鍵が変わります。

シード導出はBIP-39と同じものですか?

BIP-39の半分です。この標準は、エントロピーから単語への変換と、単語からシードへの変換という2つの別個の変換を定めています。シード導出は後者であり、BIP-39はこの2つが互いに完全に独立していると述べています。

次に読む

関連用語

ウォレットとカストディのその他の用語

このページを英語で読む