見出し画像

ビットコインに学ぶブロックチェーンの真髄#6 暗号技術編2 電子署名

昨今話題のブロックチェーン技術について、その概要と詳細な仕組みを10 回くらいの連載を通じて詳しめに解説していくシリーズの第6回目になります。

第5回目はこちら

シリーズ全体はこちら

前回はP2P通信によって実現した分散ネットワーク上にデジタル通貨システムを構築するにあたり暗号技術が必要であることを説明し、その基本的な部分(ハッシュ関数、電子署名の概要)を説明しました。

今回は実際に電子署名がどのようにブロックチェーンに適用されているのかを解説していきます。

ブロックチェーン(ビットコイン)の電子署名の仕組み

電子署名はビットコインにおいても、送信者が「私は公開鍵と対応する秘密鍵を持っています」ということを示すために使われます。ただし、ビットコインの場合は一般的な電子署名よりも少し複雑です。ビットコインでは電子署名を使って、ビットコインの所有を証明しています。

ブロックチェーンの電子署名の大まかな仕組み

Aさん→Bさん→Cさんの順でビットコインを送金するとします。そしてここではAさん→Bさんの送金は既に完了しており、現在BさんがCさんへの送金を行おうとしている状況だとします。

ビットコインの取引情報(トランザクション)はインプットとアウトプットで成り立っています。インプットとはこれから送金に使われるビットコインの情報(誰が、どのビットコインを使うのか)、アウトプットとはそのビットコインの送信先の情報(誰に、いくら送るのか)です。

AさんはBさんに送金した際、トランザクションのアウトプットで「Bさんに」という指定と「ロック」をかけています。そしてこのロックの解除条件は「次の送信者が、Bさんの公開鍵に対応する秘密鍵を持っていることを示す」となっています。

BさんがCさんに送金するとき、トランザクションのインプットにおいて「AさんからBさんあてのアウトプット」を指定し、Bさんはロックを解除するために対応する署名を付してビットコインネットワークにトランザクションを送信します。

その署名付きトランザクションを受け取ったノードはその署名とBさんの公開鍵から、ある計算を行い、その結果とトランザクションを比較して、一致していれば正当なトランザクションであると認めます。

このやり取りは、「前の所有者がビットコインをロックする」→「現所有者がロックを解除するための署名を作る(この時点で次の所有者を指定しロックをかける)」→「ノードが署名を検証し解除する」という3つの段階で構成されています。そして電子署名が活用されているのは後半の2つです。

ブロックチェーン(ビットコイン)において電子署名がどのような動きをしているのかはなんとなくイメージしていただけたかと思います。では、実際に秘密鍵や公開鍵はどのようにして作られ、どのように暗号化や復号化を行うのでしょうか?

今回はビットコインで使われているECDSA署名という電子署名をもとに説明していきます。

秘密鍵と公開鍵

ビットコインでは電子署名を行うため、秘密鍵と公開鍵が必要になります。加えて、個人のアカウントを表すためにアドレスも必要になります。

秘密鍵は256ビットの数列として表されます。これは2進数で256桁の数値であり、10進数で表すと、115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936というとてつもなく大きな値になります。この大きな鍵空間の中から一つの値をランダムに選びます。その数列が秘密鍵となります。

秘密鍵は通常以下のように64桁の16進数で表示します。

119FF4DE80124AE5C5EC6DB6D24FFC67354221F5CB4232748B8560780C720BB4

公開鍵は秘密鍵のようにランダムに選ぶというわけにはいきません。なぜなら、電子署名では秘密鍵で署名したものを公開鍵で検証できなければならないからです。適当に選んだ数字がそのようにうまく機能するわけがありません。したがって、秘密鍵と公開鍵は数学的に密接な関係を持つ必要があるのです。

ビットコインでは、秘密鍵kから公開鍵Kを作る式は次のように表せます。

K=kG

Gは生成元と呼ばれる決まった値です。とても単純ですね。しかし、少し頭の良い人ならこの計算式では電子署名が成り立たないことがわかると思います。電子署名は、「公開鍵を入手してもその対となる秘密鍵は特定できない」という性質があってこそ成り立つものです。こんなに単純な計算では、公開鍵Kが分かった瞬間に秘密鍵kを特定できてしまいます。

しかし、実際にはkGの値が分かってもkを特定することができないようになっています。実はこの演算は楕円曲線上で定義された演算なので単純な掛け算ではありません。kGからkを求めること、すなわち公開鍵から秘密鍵を求めことは、非常に難しいことが知られています。これは離散対数問題と言って、この問題を効率よく解くアルゴリズムは未だに見つかっていません。

ビットコインで利用されている楕円曲線DSAというアルゴリズムに準じて計算すると、先ほど示した秘密鍵に対応する公開鍵は以下のようになります。

04868D8B734701760B54BC119D2700B2C56C9DE0A5AED82B1BDBE1C1FDAAA3DB3FB4D0E8EF028B09696E6DA41EC7AF1225FFE1E8A36366C2CD5707278AA0B5FFAD

とても長いです。

暗号化、復号化の方法は詳しく説明するととても難しいです。「暗号化は秘密鍵を持っている人にかできなくて、復号化して検証することは公開鍵を持っている人なら誰でも簡単にできる」ということだけ押さえておいてください。

ブロックチェーンにおける電子署名の役割は、送信者とトランザクションの結びつきを証明することです。もう少し細かく表現すると、「公開鍵に対応する秘密鍵の所有」と「メッセージ(トランザクション)の改ざんの有無」を示すことです。

アドレスの生成

分散ネットワーク上で電子署名を導入する事により、「自分の資産を扱えるのは自分だけである」という環境を作り出せることがわかりました。そしてユーザーは秘密鍵と公開鍵を駆使することにより、安全にデジタル通貨の送金を行うことができそうです。

しかし、頻繁に指定する必要のある公開鍵は16進数で130桁とかなり長くなっており、これを毎回送金時に指定するのは面倒です。さらにブロックチェーンの性質上一度記録されてしまったトランザクションは基本的に取り消しできないので、公開鍵を一文字でも間違えてしまうと自分の資産を誰もいない空間に捨てることになってしまいます。

そこで公開鍵をより表記するために、ビットコインではアドレスが導入されています。

アドレスの生成には前回説明した一方向性ハッシュ関数を使います。公開鍵のハッシュ値を算出し、それをBase58エンコードしたものアドレスとします。つまり、公開鍵からアドレスを特定することは可能ですが、アドレスから公開鍵を特定することはできない仕組みになっています。

先ほどの公開鍵から生成されるアドレスは以下の通りです。

175AH1pT1LtUUY9t5nB9beKp78R7tCB2jY

これでもまだ長いですが、公開鍵と比べるとだいぶすっきりしました。

おわりに

今回は電子署名がブロックチェーンでどのように利用されているのかを、秘密鍵、公開鍵、アドレスの生成方法とともに解説しました。

次回は補足として楕円曲線DSAについて説明します。


このシリーズは『あたらしい経済』で私が執筆した「ブロックチェーンは今までのシステムと違って何がすごいのか〜ノンプログラマーでも解るブロックチェーン入門」シリーズを大幅に加筆修正したものになっています。

Web illustrations by Storyset

この記事が気に入ったらサポートをしてみませんか?