
こんにちは、yoshihiroです。
仮想通貨って暗号通貨とも呼ばれているくらいだし(英語だとcryptocurrency)、何か暗号が関わってるんだろうな~とは思っても、具体的な暗号化の方法について知ってる方はほとんどいないのではないでしょうか?
実は仮想通貨(ブロックチェーン)では、楕円曲線暗号というめちゃくちゃ面白い暗号化の方法が採用されているんです。今回はこの楕円曲線暗号の面白さを、なるべく数学的な話を排除して皆さんと共有したいなと思います。なお、直感的な分かりやすさを重視しているので、若干数学的に厳密でない可能性があることをご了承ください。
いきなり楕円曲線暗号に入る前に、ざっと暗号化の種類についてまとめましょう。
共通鍵暗号とは、1つの鍵(=共通鍵)で暗号化も解読も行える暗号です。家の鍵と一緒で、閉める時も開ける時も同じ鍵を使います。これは最も基本的な暗号で、昔から様々な場面で使われてきました。
簡単な例として、「後ろに3文字ずらす」という共通鍵を使うと、
「yoshihiro」→「brvklklur」
と暗号化できます。もし解読者が共通鍵「後ろに3文字ずらす」を知っていれば簡単に解読できますね。
公開鍵暗号とは、暗号化する時の鍵(=公開鍵)と解読する時の鍵(=秘密鍵)が異なる暗号です。この暗号方式のみそは、公開鍵を使えばだれでも簡単に暗号化できるにも関わらず、秘密鍵を持っていなければ、暗号化した本人ですら解読できなくなることです。公開鍵を使って一度閉めると、秘密鍵を持っている人しか開けられないのです。
仮想通貨の場合、ウォレットアドレスが公開鍵となっており、シークレットキーが秘密鍵になっています。すなわち、ウォレットアドレスが分かれば、だれでもビットコインを送金できますが、送金されたビットコインを使えるのは、シークレットキーを知っている受け取り人だけです。
公開鍵暗号としてよく使われているものに、RSA暗号というものがあります。楕円曲線暗号を理解するうえで知っていた方がよいので少しだけ説明します。
RSA暗号とは、2つの素数を掛け合わせるのは容易だが、逆にある数を2つの素数に素因数分解するのは困難であるという性質を使っています。
みなさん、713って何で割り切れるか分かりますか?
ぱっとは出てこないし、電卓を使ってもなかなか見つかりませんよね。
じゃあ、23×31は計算できますか?
暗算だと少し大変ですが、電卓を使えば5秒で答えが分かりますね。
このように、大きい数字の約数を探すのが困難である性質を使っているのがRSA暗号です。この場合、713を公開鍵、23と31を秘密鍵とすることができます。暗号化したい文章を713を使って色々計算をするのですが、この時に数学的なトリックを使うことで、713を知っていても元に戻せないけど、23か31を知っていれば簡単に解読できる暗号文を作ることができるのです。
ちなみにRSA暗号は、電子署名に使われており、私たちの活動に欠かせない暗号となっています。
さあ、いよいよ楕円曲線暗号の説明です。基本的な考え方はRSA暗号と同じで、片方から計算することは簡単だけど、元をたどるのは難しいという性質を使っています。
楕円曲線とは、下の図のような式で表される曲線です。
この曲線上の点はとても面白い性質を持っています。例えば、下図で曲線上の点Pを考えます。この時、P+P(=2P)は必ず同じ曲線上にあり、簡単に位置を求めることができます(一般的な足し算とはちょっと違います)。
(1)点Pの接線を引く
(2)接線と曲線との交点で、符号を逆転させる
さらにもう一回Pを足した3Pも同様に求めることができ、何回でも繰り返すことができます。
これをn回繰り返すと、nPは(感覚的に)ランダムな場所へ行きます。この時のPとnPを、公開鍵として使うことができるのです。PとnPが分かったとしても、nを求めるのは至難の業であり、現時点で有効なアルゴリズムは開発されていません。つまり、nを秘密鍵とすることができるのです。
楕円曲線暗号の最大の利点は、nが比較的小さい数字でも信頼できるレベルで暗号化ができる点です。RSA暗号では2048bit(10進法で600桁くらいの数)が必要でしたが、楕円曲線暗号では512bitで十分であり、かつRSA以上の強度があるとされています。このデータ削減により通信速度を早くでき、ブロックチェーン開発の土壌ができあたったのです。
どうでしょうか?楕円曲線暗号に興味を持ってもらえましたか?暗号って面白いですよね。なんか厨二心がくすぐられるというか。
仮想通貨が好きな皆さんなら、きっと楕円曲線暗号も好きになってくれるんじゃないかなと思って、書いてみました。最後まで読んでいただきありがとうございました。