Bitcoin Explorerを使用したBitcoinプライベートキーの正当性確認

#概要

私の個人的な状況として以下のような要求があった。

* ビットコインのプライベートキーを文字列として書き留め、物理的に安全な場所に保存し自分で管理している。その書き留めているプライベートキーに転記ミスがないか確認をしたい。

一方、プライベートキーをインポートできるウォレットソフトウェアを導入してプライベートキーを組み込んでみれば上記はできるのだが、プライベートキーの流出は致命的であり、ウォレットソフトウェアを導入するための安全な環境を整えたりするのが面倒に感じられていた。

そこで今回はプライベートキーなどをかなり原始な方法で操作できるbitcoin explorerを利用して書き留めたプライベートキーの正当性を確認してみたのでメモを残す。

実施してみた結果、bitcoin explorerを使用すればプライベートキー、パブリックーキーを直接操作できるので、プライベートキー、バブリックキーのエンコーディングなどがイメージしやすくなり、自分が確かにプライベート鍵を保存していることが実感できると思った。

# Bitcoin Explorer 

Bitcoin Explorerは[こちら](https://github.com/libbitcoin/libbitcoin-explorer/wiki)からバイナリもソースもダウンロードできる。

説明は以下のようになっている。
>BX is a general purpose Bitcoin command line utility that supports Linux, OS X and Windows. The application can be built and distributed as a single file binary with no run time dependencies apart from the operating system.

ダウンロードしたバイナリが信用できると思えばバイナリをダウンロードして使えば良いし、それが信用できないと思うならソースコードを（恐ろしく手間がかかると思うが）チェックの上コンパイルして使用すればいい。

私の場合はソースコードをチェックする手間は避けつつリスクを最小化するために、ダウンロードしたバイナリをネットワークから切り離された環境で実行することにした。

# L,Kで始まるプライベートキーの正当性の確認
私が以前利用していたWalletソフトウェアからエスクポートしたプライベートキーはLで始まるフォーマットであった。L,Kで始まるプライベートキーはWIF-compressedと呼ばれるタイプの秘密鍵のフォーマットであり、チェックサムを含めてbase58でエンコードされている。チェックサムがついているので書き留めたものにタイポなどがあれば不整合を検出できる。

書き留めたWIF-compressedの秘密鍵が正当なものかどうかは次のように確認できる。（当然のことながら下の例で使用しているプライベートキーはテスト用に作成したものであり、実際にbitcoinが紐づけられているものではない）

```terminal
btcexplorer@ubuntu002:~$ ~/bin/bx base58check-decode L28wNkUbXvyvySkUEzrwsQ2DnEZLtyoks1NGbZU8fGx1qYcWmTsT
wrapper
{
    checksum 1727741647
    payload 92bb56e9b57be08d1fe9a0a2e6699370e1f857ca1620321815f451bffcbe8ec301
    version 128
}
btcexplorer@ubuntu002:~$ 
```

ここで92bb56e9b57be08d1fe9a0a2e6699370e1f857ca1620321815f451bffcbe8ec3がプライベートキーの16進数表記であり、01は規則で決まっているsuffixである。

仮に一文字間違えて（28文字目のLをMに置き換えてある）WIF-compressedのプライベートキーを与えると結果は以下のようになる。このことから上記のコマンドで正常にpayloadが出力されれば与えたWIF-compressedのプライベートキーは正当であることがわかるということが言える。

```terminal
btcexplorer@ubuntu002:~$ ~/bin/bx base58check-decode L28wNkUbXvyvySkUEzrwsQ2DnEZMtyoks1NGbZU8fGx1qYcWmTsT
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::program_options::invalid_option_value> >'
  what():  the argument ('8092bb56e9b57be08d1fe9a0a2e6699370e1f857e23237c852681b0f26d8da9096a9b03efb66') for option is invalid
中止 (コアダンプ)
btcexplorer@ubuntu002:~$
```

# セキュリティに関しての注意点

上記のようなテストを実施する際に実行環境に何らかの問題がありプライベートキーが第三者に漏洩するると、そのプライベートキーに紐づいたbitcoinは盗み出される可能性がある。ビットコインのシステムの性質上、一旦盗まれてしまうと、盗まれたビットコインを取り戻すのはほぼ不可能となる。そのため実行環境や使用するソフトウェアについてはかなり注意する必要がある。特に扱う金額が多くなった場合は手間を惜しんで万が一の事故に遭うと悲惨なので、相当の注意をするべきだと思われる。

今回は少なくとも次のようなリスクについて考えた。
* ダウンロードしたbitcoin explorerバイナリに悪意のあるコードが混ざっている。
* 実行環境のOSなどがスパイウェアやウィルスなどに犯されていて、そこからプライベートキーが漏洩する。

そこで、完璧ではないが、以下のような状態はリスクがあると考えて
* ネットワークにつながったままのマシンの上でgithubからダウンロードしてきたbitcoin explorerを使用する。
* 普段利用しているWindows上でbitcoin explorerを使用する。

次のような手順で作業を実施した。
* 普段使用しているノートPC(Windowsマシン）上でHyper-Vを設定、ゲストOSとしてubuntuを導入・起動
* ubuntu上で専用ユーザbtcexplorerを作成
* ユーザbtcexplorerのホームディレクトリのbin下にbitcoin explorer（githubからバイナリをダウンロード）を導入
* ノートPCをネットワークから切り離し
* btcexplorerユーザ権限でコマンドを実行してプライベートキーの正当性を確認
* btcexplorerユーザ領域のデータを削除。btcexplorerユーザを削除
* ノートPCをネットワークへ復旧

時間あればHyper-VのゲストOSでなく、かつネットワークからも私が使用しているPCのWindows OSからも切り離された検証用の環境を作って実施した方が
より安全とは思う。気が向いたらラズパイとかでやってみるかも。