秘密鍵を秘密にしないといけない理由

2018-03-07

仮想通貨の取引を初めて見ると、色々な所で「秘密鍵は絶対に他人に教えないでください」とか言われていると思うの。

取引所を使っている人はあまり秘密鍵を目にしないと思うけど、「GOXリスクが〜」というので大量の仮想通貨持っている人は「怖いからウォレットに移動!」とか、「よっしゃICOとかいうのに参加しちゃうぞ」とICOの手順に従ってウォレットを作成すると、なんかすごい素っ気なく秘密鍵というものが見えると思います。

ご丁寧にQRコードとか出てたりして、なんか気軽に扱えそうな気がしますよね?

でも、秘密鍵は絶対に他人に見せてはダメ。ということを色々調べて、自分なりに理解できてきたので、まとめてみようと思います!(`・ω・´)ゞ

公開鍵暗号方式という仕組み

「なぜ秘密なのか?」の前に、まずは仮想通貨で使われている、取引承認の仕組みを理解する必要があります。ブロックチェーンで使われているのは公開鍵暗号方式の仕組みを応用しています。公開鍵方式がどんなものかすごい簡素に書くと、鍵を生成する仕組みに対して、無作為な数字を与えると”秘密鍵”と”公開鍵”のペアを作ってくれます。

特徴としては

  • 秘密鍵から公開鍵を作成できる
  • 公開鍵からは秘密鍵は作成できない
  • 秘密鍵で暗号化したものは、ペアとなる公開鍵でのみ復号化できる
  • 公開鍵で暗号化したものは、ペアとなる暗号鍵でのみ復号化できる

ちなみに、「公開鍵から秘密鍵は作成できない」と書いたけど、絶対にできない訳じゃないです。素因数分解をすることで公開鍵から秘密鍵を作ることはできます。でも、現実的ではない。

なぜかというのは、ここのサイトがわかりやすいです。
共通鍵暗号と公開鍵暗号の仕組み

え?わかりにくい?よね…
僕も全ては理解できていない(笑)

素因数分解が現実的ではないのは、効果的な計算方法がないので、考えられるパターンを総当りしないといけないというところ。

総当たりでも、「PCの力を使えばすぐでしょ?」と思うひとはこちらの動画を見てください。組合せ爆発というやつです。

公開鍵から暗号鍵を作れないというのは、この動画にあるような計算をひたすら続けて、公開鍵と同じ文字列を見つけるような作業。不可能ではないけど、すごい難しいんだなと思ってください。この難しさがそのまま強固なセキュリティとなり、復号化の利便性からこの公開鍵暗号の仕組みは身近なところで使われています。

公開鍵暗号方式の実際の活用

例えば通販サイト(以下はAmazon)

赤枠で囲ったところ、アドレスが「https://」(s付き)で始まって、その左横に「保護された通信」と表示されていて、更に証明書も正式なところから発行されている。これは「暗号化通信でやりとりしていますよ」ということを表しているものです。

こういうサイトでは、公開鍵暗号方式で情報のやり取りが行われているので、情報漏洩の心配がないです。

具体的には、Amazon側は自分達の秘密キーで暗号化して、インターネット上で情報を公開しています。自分自身がサイトを閲覧する時は、Amazonが発行している公開鍵を受け取り、復号化することで人間が読める形式になります。

これは自分とAmazonとのやり取りではあるけど、仮に第三者に通信が傍受されていた場合、その第三者も見ることができます。

でも、公開情報なので第三者に見られたところで別に問題はないのです。

これに対して、クレジット情報や住所、電話番号 等の自分とAmazon以外に知られたくない情報は、公開鍵で暗号化して送信されます。(ブラウザがやってます)

この場合、仮に第三者に通信を傍受されても、公開鍵では復元ができないため安全にAmazon側にだけ、情報を伝達することができます。

Amazonに悪意があったらどうしようもないんだけどね…

と、まあこの辺りは僕も会社に入社した2004年頃でも、情報処理試験に鍵暗号方式の問題が出ていたぐらいなので、昔からある考え方です。

仮想通貨の取引承認方法

仮想通貨のすごいところは、この方式を使って安全に個人間でのデータの受け渡しが可能な仕組みを提案したところ。

例えば、福沢さんは自分の持っている10BTCを、野口さんに送金したい、とします。この場合、福澤さんも野口さんも各々で公開鍵と秘密鍵のキーペアを作成します。そして、福澤さんは自分の公開鍵から、野口さんの公開鍵へ、10BTCを送るという取引情報を作ります。

ここまでだと、言ったもん勝ちみたいになるんだけど、この「10BTCを送る」と宣言した取引情報に対して、福澤さんは秘密鍵で署名を行います。

この結果出来上がるのが、送金情報と署名を合わせたトランザクションデータ(TX)です。

このトランザクションデータ(TX)は誰でも見れる状態だけれども、秘密鍵で署名が行われているため、誰も複製することができません。ただし、秘密鍵の特性によって、誰もが参照できる福澤さんの公開鍵で、この取引を発行したのは福澤さん以外にあり得ないことが、明確にわかります。

現実世界に例えるなら

  • 取引情報 → 契約書
  • 秘密鍵  → 印鑑
  • 公開鍵  → 印鑑の印影
  • TX     → 押印済みの契約書

と思って貰えばいいと思います。

この仕組みを理解した時に「すごい!」と思って鼻血出そうになりましたよ。

だって、キーペアの生成なんて個人情報を全く必要せずにいくつでも作れるし、それにも関わらず、2者間での取引を誰が見てもすぐに正しい取引だと判断できる仕組みになっていて、そこには政府や銀行といった信用機関がいなくても構わないという仕組みになっている。

これを既存の技術の考え方を変えただけで実現している。その事実だけで鼻血出そうだよ。公開鍵暗号方式の仕組みは知っていたけど、双方でキーペアを持つというだけで、お互いが自身の証明に使えて、誰が見ても公正なものと判断できる仕組みになるというのがすごいよね!!

でも、これだけではまだ問題がある。

  • 「取引が正当なものである」というのを誰が証明するのか?
  • 二重取引をどう防ぐのか?(福澤さんが10BTCしか持っていないのにも関らず、野口さんと樋口さんの2名に同時に10BTCを送金)

そこで考えられたのが、ブロックチェーンという技術。
ブロックチェーン技術に関しては… 後日に続く(かもしれない…)

秘密鍵は絶対に秘密なんです!

ここまでくれば秘密鍵が秘密な理由はわかると思うんだ。

なんだけど、前述の内容にはちょっとだけ嘘があるのです。ここで懺悔しておきます。

実際のBitcoinの送金先アドレスに使われているのは、公開鍵そのものではなくて、公開鍵を2回ハッシュ化したものがアドレスとして使われています。

ハッシュ化が何かというのは…まあ、あれだ。

ある値を入力したらランダムな値が出てくる仕組みだと思ってもらえればいいです。

特徴は、入力される値の長さに関らず、出力結果は一定の長さになる。同じ入力値からは必ず同じ出力値が得られる。出力値から入力値はわからない(復号化もできない)

何でハッシュ化しているのかは、断定的な内容は見当たらなかったけど、おそらくデータ量を圧縮する目的なのだろうなと思います。

ここまでくれば、流石に秘密鍵を他人に教えてはいけない、ということが理解できるのかなと思うんだよね。

秘密鍵がわかった時点で、公開鍵が作れるし、公開鍵からはあなたのBitcoinが溜め込まれているウォレットのアドレスも作れる。さらに秘密鍵があるので、そのウォレットからの出し入れも自由だぜ!

☆ワ-(ノ。・ω・)八(。・ω・。)八(・ω・。)ノ-ィ!!!

だから、秘密鍵を他人に教えるのは絶対にダメだし、もし自身の秘密鍵がわからなくなってしまったらそれは誰にもわからないという事になります。だからこそ仮想通貨取引は自己責任であり、理解ができない人はやらない方がいいのはこのためです。

ところで、あなたの秘密鍵は今どこで保管されていますかね?ね?ね?(。・ω・)ノ゙

これを読みながら書いてます(๑و•̀ω•́)و