Mastering Bitcoin 第4章のP92からP100あたりまでをまとめます。
ウォレット内における鍵の生成方法について書かれています。

秘密鍵の生成の方法には決定性鍵生成という方法がある。
一方向ハッシュ関数を使って前に出てきた秘密鍵から順々に新しい秘密鍵を生成する。

非決定性(ランダム)ウォレット

Type-0非決定性ウォレット

ランダムに生成された秘密鍵の集まり。
プライバシーの観点から複数のトランザクションに対してビットコインアドレスを使いまわしたくないという精神を考えると、
トランザクション毎に秘密鍵を生成することになり、資産の入ったウォレットの秘密鍵を失くさないように常にバックアップなどの管理が必要になります。
このため、このウォレットはビットコインコアの開発者からあまり推奨されていません。

決定性ウォレット

1つのseedとなる秘密鍵から一方向ハッシュ関数を使って順々に秘密鍵を生成します。
そのため、seedとなる秘密鍵さえバックアップし管理しておけば良いことになります。

Mnemonic Code Words

seedとなる文字列はランダムに生成しているのでパット見で覚えることはできないですし、書き写すのもよく見比べないと間違えてしまいます。
そこで、文字列を12から24個の英単語(他の言語もある)の列で表します。
生成したseedのbit数に応じて英単語の数が変わります。
手順としては

  1. 128ビットから256ビットのランダムな文字列を生成
  2. ランダムな文字列のSHA256ハッシュの先頭4ビットを取得し、ランダム文字列のチェックサムを生成
  3. このチェックサムをランダムな文字列の最後に付加
  4. 2048個のあらかじめ決められた英単語の辞書のインデックスとして使うために、この文字列を11ビットずつの部分に分割
  5. mnemonic codeを表す12から24この英単語に置き換える

以下のリンクにワードの候補が掲載されています。
bips/bip-0039 at master · bitcoin/bips

階層的決定性ウォレット(HDウォレット)

階層的決定性ウォレットはHierarchial Deterministicウォレット(HDウォレット)と呼ばれます。

seedから1つの秘密鍵が生成され、そこからツリー構造をなして順々に秘密鍵を生成していきます。

マスター秘密鍵

HDウォレットにおいて、マスター秘密鍵を作る手順を説明します。

  1. 暗号学的に安全な疑似乱数生成器を使ってseedを生成(seedはmnemonic code wordsを使って保存しておく)
  2. seedをHMAC-SHA512を使って512ビットにの文字列にハッシュ化
  3. 上で生成した文字列の最初の256ビットをマスター秘密鍵、残りの256ビットをマスターchain codeとします。

このマスター秘密鍵から前回の記事で説明したように楕円曲線暗号を使ってマスター公開鍵を生成します。

子秘密鍵

親秘密鍵(マスター秘密鍵)から子秘密鍵を生成します。
手順は以下の通り

  1. 親秘密鍵から楕円曲線暗号を使って親公開鍵を作成
  2. 親公開鍵 + 親chain code + インデックスをHMAC-SHA512関数にかけ、512ビットのハッシュを作成する
  3. 上で作成したハッシュの先頭256ビットと親秘密鍵とインデックスを使って子秘密鍵を作成する
  4. ハッシュの後半256ビットは子chain code とする。

512ビットのハッシュから秘密鍵とchain codeに分けるのは、秘密鍵からだけで子秘密鍵を作れないようにするためです。
子秘密鍵を作るにはchain codeも知る必要があります。
インデックスはこの親秘密鍵から何個目の子秘密鍵かの目印です。このインデックスにより、生成される秘密鍵が異なるものになります。

子公開鍵の生成

子公開鍵の生成方法は2つあります。

  1. 子秘密鍵から楕円曲線暗号を使って生成する
  2. 親公開鍵からHMAC-SHA512ハッシュ関数を使って生成する

この親公開鍵から子公開鍵を作成できるという性質から、ウェブサーバーなどには秘密鍵は必要なく親公開鍵を置いておいておくだけで複数のビットコインアドレスを作成してビットコインを受け取ることが可能です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です