仮想通貨の仕組みを調べていると「公開鍵暗号方式」という言葉が出てきます。
なかなか難しい言葉ですが、たとえ話をたくさん使って考えると意外と難しくないものです。
そこで今回は「ビットコインを送金するときの流れ」を例に挙げながら「公開鍵暗号方式」を解説してみようと思います。
1.ビットコインを送金する時の流れ
デジタル署名/コインの真正な保有者であることを証明する
ビットコインを送るには、まず「デジタル署名」が必要です。
これは何をしているのかというと「署名」という言葉の通り、「本人確認」をしています。
紙にペンで署名するときと同じですね。
ビットコインが本当に自分のものであることを証明します。
ビットコインを送る前に「そもそもビットコインを持っているのか」を確かめているということですね。
ビットコインはデジタルな存在です。
つまり電子的なものですから目に見えません。触ることも出来ません。
物理的に持っていることで「私の持ち物です」と証明できないわけです。
ですから「デジタル」で「電子的」な存在であるビットコインについて、「デジタル」に「電子的」に「このビットコインは本当に私の持ちものです」と証明しなければならないんですね。
これを「デジタル署名」と言います。
ビットコインを送るときはまずこの「デジタル署名」から始まるということを覚えておきましょう。
デジタル署名から送金まで
「秘密鍵」と「公開鍵」を使って暗号化
では、具体的にデジタル署名をどのようにおこなうのか。
送金までの流れを見ていきましょう。
先に全体像をお見せします。
- 秘密鍵で公開鍵を作る。
- 取引データを作成する。
- 秘密鍵で署名データを作成する。
- 取引データと署名データをネットワークに公開する。
- マイナーがデータを検証する。
このような流れで「デジタル署名」をおこないます。
「デジタル署名」を作成して、第三者のお墨付きをもらって、晴れてビットコインを送金できます。
◆各工程の意味を解説
1.秘密鍵で公開鍵を作る
使うものは「秘密鍵」と「公開鍵」です。
2つは「対(つい)」になっているものと考えてください。
むろん、これは「デジタル証明」の話なので鍵といってもデジタルなものです。
イメージとしては「南京錠」を思い浮かべていただければ良いでしょう。
- 「秘密鍵」=「南京錠の鍵(鍵の部分)」
- 「公開鍵」=「南京錠の錠前(鍵穴の部分)」
このとき考える「南京錠」は、市販のものではなく世界に唯一存在する「ペア」だと思ってください。
つまり、1つの「秘密鍵(鍵)」で開けられる「公開鍵(錠前)」は世界に1つしかないということです。
逆に言うと「公開鍵」は「秘密鍵」がないと絶対に開けられない、ということになります。
「秘密鍵」は「自分しか知らないパスワード」のようなものです。
仮に「kejgif94u6jf7bhkjre7854ijtyfud84」みたいなものだと思ってください。(いま適当に考えました)
秘密鍵はいわば「キャッシュカードの暗証番号」や「マイナンバー」です。絶対に他人に知られてはいけません。
この「秘密鍵」を使って「公開鍵」というものを作ります。
「公開鍵」というのは、先に言った通り「錠前(鍵穴の部分)」だと考えましょう。
なので、鍵を「開ける」ものではなくて、鍵を「かける」ものです。
「公開鍵」は暗号化するためだけに使います。
「秘密鍵」を使って「公開鍵」を作るということは、デジタルに「鍵」から「鍵穴(錠前の部分)」を作ってしまうということです。
現実では考えられない話ですが、デジタルだからこそこんなことができます。
2.取引データを作成する/3.秘密鍵で署名データを作成する
「秘密鍵」と「公開鍵」を準備したら、次に取引データを作成します。
これは単純に「私(Aさん)からBさんに、いくらいくらビットコインを送ります」という意味のデータを作成するという意味です。
続いて「署名データ」というものを作ります。
今回の話で一番大事な部分ですね。
「デジタル署名」の核心部分です。
「いまから送ろうとしているビットコインの所有者は私です。私(A)からBさんにビットコインを送る取引は本当です」というデータを作成します。
つまり「サイン」ですね。
「ハンコを押した」ようなものと考えればいいでしょう。
まさに「デジタル」な「署名」というわけです。
そして「署名データ」は「秘密鍵」を使って暗号化します。
注意して欲しいのは「秘密鍵」を使って暗号化したということです。
「公開鍵」ではありません。ごっちゃになりやすいので、注意です。
「南京錠」の例えからは少しハズれてしまいますが、「鍵(秘密鍵)」だけで「鍵をかけること」もできます。
要は、
- 「秘密鍵」で鍵をかけることが出来る。
- 「公開鍵」で鍵をかけることも出来る。
ただし、
- 「鍵を開ける」には「秘密鍵」が必要。
- 秘密鍵で鍵をかけた場合、開ける鍵は公開鍵。
ということです。
つまり「秘密鍵」は「鍵をかけること」も「鍵を開けること」も出来ますが、「公開鍵」は「鍵をかけること」しかできません。
4.取引データと署名データをネットワークに公開する/5.マイナーがデータを検証する
さて、「取引データ」と「署名データ」が完成しました。
ビットコインを送金する側がやることは終わりです。
あとは作成したデータをネットワーク上に公開します。
つまり、インターネット上にアップロードするということですね。
また同時に「公開鍵」もネットワーク上で公開します。
※「秘密鍵」ではありませんよ~。公開するのは「公開鍵」です!
あとはネットワーク上に無数に存在する不特定多数の「マイナー(採掘者)」と呼ばれる人たちが「検証」します。
「検証」とは何かというと、この公開された「取引データ」と「署名データ」を、公開された「公開鍵」を使ってちゃんとペアになっているか確認しているんです。
先に言ったように「公開鍵」で鍵を開けることは出来ません。
しかし、秘密鍵を使って暗号化した「署名データ」と「公開鍵」がペアになっていることは確認できます。
数学的に「難易度の高い問題」にはなりますが、コンピューターを使えば解ける程度の問題ではあります。
ですから、この「ペアになっているかどうか」を確認することで、数学的に「署名データ」の真実性を検証しているのです。
実はこれが「マイナー(採掘者)」の語源である、「マイニング(採掘)」という作業です。
※ちなみにマイナーはこの検証作業(マイニング)の報酬として、ビットコインをシステムから新たに受け取っています。
マイナーの検証が終われば、送金は完了します。
取引データはネットワーク上のすべてのマイナーに共有されるので、改ざんされることはありません。
これがビットコインを支える「ブロックチェーン技術」の「セキュリティ面」の強さです。
暗号化は「公開鍵暗号方式」で
以上が「ビットコインを送金するときの流れ」です。
デジタル署名の段階で「秘密鍵」と「公開鍵」を使っていましたよね。
これが「公開鍵暗号方式」です。
ちょっと見方を変えて、ビットコイン送金の流れを「受信者(受け取り側)」の視点から考えてみましょう。
- 受信者は自分の「秘密鍵」で「公開鍵」を作る。
- 受信者は「公開鍵」を送信者に渡す。
- 送信者は「公開鍵」を使ってデータを暗号化する。(前段では省略していました)
- 受信者は送信者から暗号化されたデータを受け取る。
- 受信者は「秘密鍵」を使って暗号を解読する(復号)。=ビットコイン着金
やっぱり「秘密鍵」と「公開鍵」を使い分けて暗号化と復号化(暗号の解除)をおこなっています。
このペアになっている2つの鍵を組み合わせて暗号化をおこなうのが、公開鍵暗号方式です。
「共通鍵暗号方式」との違い/合鍵がたくさんあると不安
似たような言葉で「共通鍵暗号方式」というものがあります。
これはいわば「合鍵」方式ということになります。
「公開鍵暗号方式」との比較で説明すると、「秘密鍵」を送る側と受け取る側で使いまわすのが「共通鍵暗号方式」です。
暗号化するときも「共通鍵」を使いますし、暗号を解除するときも「共通鍵」を使います。
しかもお互いに同じ鍵を使うので「共通鍵」というわけです。
この方式は単純で分かりやすいのですが、やり取りする相手全員に「共通鍵」を渡してしまうことになるので、セキュリティ面にかなり不安があります。
しかもビットコインの根底にある思想は「性悪説」です。
分かりやすく言うと、お金のやり取りに関わる人が「悪い人」だろうが「良い人」だろうが関係なく、安全かつ速くお金のやり取りができることを目指す、というものです。
もしビットコインが「共通鍵暗号方式」だったとすると、マイナーによる検証作業のために「共通鍵」を渡してしまうわけですから、署名データが解読されてしまいます。
また、共通鍵を知っていれば本人に成り済ますことも出来るわけですから、悪用し放題です。
悪い人がいたらすぐに身元がバレてしまうような狭い範囲や「悪いことはしない」という前提でお金のやり取りをするのであれば「共通鍵暗号方式」で良いのですが、ビットコインのコンセプトからは外れてしまいます。
「性悪説」で設計したほうが安全ですしね。
そういうわけで、ビットコインを始めとする仮想通貨では「公開鍵暗号方式」が使われるのが一般的と言えます。
まとめ
- ビットコインは、デジタル証明によってその「所有権」を担保している。
- 取引データは「秘密鍵」と「公開鍵」によって暗号化される。
- マイナーは「公開鍵」を用いてデジタル証明と取引データの整合性を検証する。
- 受信者は「秘密鍵」を用いて暗号を解除(復号)し、お金を受け取る。
[2018/02/01 追記] 指摘があったので修正しました。