前回、秘密鍵、公開鍵、公開鍵ハッシュ、Bitcoinアドレス(P2PKH)の求め方を説明した。
今回は、それぞれの使いどころを説明しよう。
まず覚えておいてほしいのは、こういう前提だ。
- 公開鍵ハッシュからBitcoinアドレスを求めることができる
- Bitcoinアドレスから公開鍵ハッシュを求めることができる
- 公開鍵から公開鍵ハッシュを求めることができる
- 公開鍵ハッシュから公開鍵を求めるのはほぼ不可能
- 秘密鍵から公開鍵を求めることができる
- 公開鍵から秘密鍵を求めるのはほぼ不可能
秘密鍵→公開鍵→公開鍵ハッシュ、の部分は一方向ハッシュという計算を使っている。
A→Bは計算できるし、毎回同じ計算結果が得られるが、B→Aは計算できない、というやつだ。
「ほぼ不可能」としたのは、力任せに一方向ハッシュの計算をし続ければ、いつかは期待する値を見つけることができるからだ。
たとえば秘密鍵は32byte=256bitなので、2256回試せば、そのどこかで出てくるはずだ。
1秒間に1億回計算できたら、何秒かかるだろうか?
うーん、生きてる間には無理そうだ。。。
まあ、0から計算を始める必要もないと思うが、割に合う作業ではないように思う。
ノイマン型のコンピュータだときついが、並列世界を作り出して正しい答を持つ世界だけを選択できるようなことができれば。。。
こういう難しい話は賢い人やずる賢い人が考えてくれていると思うので、今回は単純に「逆方向の計算はできない」ということにしておく。
まず、Bitcoinアドレス。
これは人間が見るためのものだ。
Bitcoinのブロックチェーンとしては使っていない。
次は公開鍵ハッシュ。
これは、「このアドレスに送金します」という出力で使われる。
左が送金元、右が送金先だ。
青い文字がBitcoinアドレスだが、右側の「scriptPubKey」のところに、OP_DUP、OP_HASH160に続いて16進数がずらずら並んでいるのが見えると思う。
これが、公開鍵ハッシュだ。
試しに「mwtvLXha2y5wiMt3XGFGx7EpTNG9pMdQLw」をBase58デコーダで戻してみよう。
「なってないやん!」と思うかもしれないが、落ち着いておくれ。
Bitcoinアドレスに変換する際、公開鍵ハッシュにプレフィクスとサフィックス(CRC)をつけているのだ。
頭1byteとお尻4byteを切り取って、
6FB3A987A2561CFFDFCFB0FE90AFD309576D7F88295FBF2A80
一致したでしょう?
秘密鍵はデジタル署名をするために、公開鍵はデジタル署名したのが誰かを示すために使われる。
Bitcoinの支払いは送金元と送金先を示すので、送金元の人が許可していないと送金できないようにしたい。
だから「私が送金を許可しました」という意味で、送金の記録(トランザクション)に送金元の人がデジタル署名を行うのだ。
デジタル署名の計算は、秘密鍵を使う。
秘密鍵を持つ人じゃないとBitcoinの支払いを行うことができないことになる。
ただ「これは私の秘密鍵で計算したデジタル署名ですよ~」と宣言しても信用できないので、チェックする方法が必要になる。
そのチェックに秘密鍵が必要になってしまうと意味が無い(秘密鍵を持っている人しか署名できないというルールが崩れる)。
そこで公開鍵があれば、トランザクションとデジタル署名のセットが正しいかどうかのチェックができるという計算式がある。
なので、秘密鍵だけは絶対にバラしてはいけないのだ。
そのBitcoinアドレスに入っているお金は、秘密鍵を知っている人なら誰でも送金できるようになるからだ。
カードの暗証番号みたいなものだと思えば良いか。
もう1つバラしてはいかんのが、ウォレットアプリのバックアップ。
これは秘密鍵よりもまずい。
Bitcoinアドレスの秘密鍵だけなら、そのアドレスに入っているお金だけが対象なのだが、ウォレットアプリのバックアップが漏れてしまうとウォレットに入っているすべてが対象になってしまうのだ。。。
だから、こういうのはクラウドに置いたりせず、できればPC内にも置かず、ネットや人目から切り離されたところに置いておきたいところ。
私は実験用にしかBitcoinを持っていないのであきらめられるくらいの額なのだけど、心配ならハードウェアウォレットを検討すべきだろう。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。