秘密鍵から公開鍵を作る楕円曲線暗号の簡単な仕組み
前回は、秘密鍵とは?公開鍵とは?といってところを紹介してきました。楕円曲線暗号には、署名が使われているという話をしました。
ブロックチェーンの公開鍵から秘密鍵を作成する際に使われる「楕円曲線暗号」について、紹介していきます。
●楕円曲線暗号とは
「楕円曲線暗号」言葉の響きはかっこよくないですか?
ブロックチェーンで使われる「楕円曲線暗号」についてまとめていきます。
●楕円曲線暗号の概要
楕円曲線暗号は、楕円曲線を利用した暗号方式の総称です。
前回説明した署名では、
1、公開鍵から秘密鍵を作り出すため
2、秘密鍵から公開鍵を作り出せないようにするため
を満たすために、楕円曲線暗号が用いられています。
みんなが使える、公開鍵から特定の人が使える秘密鍵作り出せちゃったら、権限奪われ放題になっちゃうので、楕円曲線暗号は大事です。
●暗号の楕円曲線の式とその説明
wikipediaによると、
ある有限体 K 上の式
を満たす全ての点 P=(x,y) の集合に、無限遠点と呼ばれる特別な点 O を加えたものである。x と y は有限体 K の要素。(Kの標数が2または3の場合、上式では不都合が生じるため、標数は2と3以外であるとする。)
が楕円曲線の式です。
グラフのイメージは以下です。不思議な形ですね( ´∀`)
言葉の補足ですが、
要素っていうのは、
例えば、{1,2,3,4,5,6}という集合があった時の1,2,3,4,5,6が要素です。
有限体Kとは、有限な体のことです。
このままだと、よくわからないので、
まず、「体とは?」というところを紹介して、次に「有限体とは?」
について、紹介していきます。
*標数については、一旦無視してください。説明すると、命題を用いて説明せざるを得ないことになるので、あとでさらっと説明します。
●体とは?
体とは、一般には
零元を除いて、四則演算が成り立っている集合のこと
と定義されます。
零元というのは、実数でいうなら0のことです。
0含めちゃったら、1/0とか計算できないので、抜きます。
四則演算が成り立つというのは、「足し算」、「引き算」、「掛け算」、「割り算」をした結果、その結果もまた、その集合に属しているということです。
集合というのは、数が集まってできたものです。例えば、自然数、実数、有理数、{1,2,3,4,5,6} などは集合です。
ここでは、具体例として、「体である集合」と「体でない集合」を考えてみます。
●体である集合
最も身近な体の例は、実数です。
実数は数学的には2乗すると0以上の数になるというのが定義ですが、日常生活で使うような、
1、2、1.2、0.333333333333.....、2/5、√2、3.14.......
などやそれにマイナス記号をつけたものを実数と言います。
実数が体である事を確認してみます。
それでは、適当な0以外の二つの実数をとってきてください。(実数では、零元が0なので)
例えば、実数の1/2、1/5、をとってくるとします。すると、
1/2 + 1/5 = 7/10(足し算)
1/2 - 1/5 = 3/10(引き算)
1/2 * 1/5 = 1/10(掛け算)
1/2 ÷ 1/5 = 1/2 * 5 =5/2(割り算)
という感じで、実数を四則演算しても、その結果が実数になっていることが確認できるかと思います。
他の場合についても同様に確かめれます。
実数が体である事が確認できました。
●体でない集合
では、体でないものは、なにがあるでしょうか?
例えば、整数は体ではありません。なぜでしょうか?
例えば、整数の1、-2を考えてみましょう。
1 + (-2) = -1 (足し算)
1 - (-2) = 3 (引き算)
1 * (-2) = -2 (掛け算)
1 ÷ (-2) = -1/2 (割り算)
割り算だけ、-1/2となり、整数でないことがわかります。
だから、体ではありません。
ここで、いや、(-2) ÷ 1 = -2 だったら成り立つじゃん
と思うかもしれませんが、0以外の整数の全ての要素に対して、四則演算が成り立たなければいけません。
だから、整数は体ではありません。
●有限体とは?
集合Kが有限体であるとは、
Kが有限な体であること。つまり、Kの零元(0)を除いた数で四則演算が成り立ち、Kの要素が有限個なこと。
です。
ちなみに、先程、体として紹介した実数も、実数の個数が有限個ではないので、有限体ではありません。
●有限体の一例
ここで、有限体の一例を紹介します。
それは、零元を除いた整数を標数pで割った余りの集合を有限体の一例として、紹介します。(Z/pZ)* と書きます。
標数は、整数を割る素数のことを言います。(厳密には違うのですが、ここでは説明のためにそう定義します。)
例えば、p=7(標数)の時、
7で割った余りは、0、1、2、3、4、5、6となります。
だから、
(Z/7Z)* = {1, 2, 3, 4, 5, 6} (0は零元だから省く)
と書けます。
これから、(Z/7Z)*が有限体かどうかを確認したいです。(Z/7Z)*が有限であることはわかっています(要素が6個しか無いので)。だから、(Z/7Z)*が体であることを確認します。つまり、(Z/7Z)*の要素を二つ取ってきても、四則演算が成り立ち、その結果が(Z/7Z)*の要素であることを確認します。
ここで、思い出して欲しいのが、(Z/7Z)*は整数を7で割った余りから零元(0)を除いた集合(={1,2,3,4,5,6})であることです。
ここに注意しながら、(Z/7Z)*が体であることを確認していきましょう。
1、足し算
2 + 6 = 8 = 1(8を7で割った時の余りが1なので)
これは、{0,1,2,3,4,5,6}の中に含まれていますね。
他の足し算の組み合わせについても同様に確認していきます。
2、引き算
4 - 6 = -2 の時、
-2はこの場合どんな値になるのでしょうか?
7で割った時の余りと同じになるはずなので、7をいくら足しても値は変わりません。(例えば、2、9(=2+7)、16(=2+7+7)は、7で割った余りが2で、同じです。)
-2 + 7= 5 となるので、ここでは、
-2 = 5 として扱えます。
確かに-2は{0,1,2,3,4,5,6}の中に含まれていますね。
他も同様に確かめます。
3、掛け算
2 * 4 = 8 = 1(8を7で割った時の余りが1なので)
1は{0,1,2,3,4,5,6}の中に含まれていますね。
他も同様に確かめます。
4、割り算
1 ÷ 3 = 1/3 の時、
1/3の値はどうなるのでしょうか?
ここでは、1/3が(Z/pZ)*={1,2,3,4,5,6}の要素であることを確認したいです。
1/3に成り立つ式は、
3 * 1/3 = 1 であるはずです。(割り算の定義から)
こうなるような、1/3を{1, 2, 3, 4, 5, 6}の要素から見つけてきましょう。
3 * 5 = 15 = 1 mod 7(15を7で割ったら余り1なので)
となります。
なので、1/3 = 5です。
確かに、1/3は、{0,1,2,3,4,5,6}の中に含まれていますね。
他の割り算も同様に確かめます。
これから先は、
このような標数がp(例では7)で割ったような集合(Z/pZ)*(例では、(Z/7Z)*={1,2,3,4,5,6})
を有限体として、
x,y が(Z/pZ)*の要素であるとして、
こちらの式を考えていきます。
*ちなみに体は”からだ”ではなく、”たい”と呼びます。
●暗号の楕円曲線の式のイメージ
さて、先程紹介した
がどんなグラフなのかについて考えていきます。
では、
まずは右辺だけとりだして、こちらの3次関数は、このようになります。
ただし、a=-2, b=0 の場合です。
で、y^2があるため、x軸にたいして、グラフが対象になるはずなので、結局、楕円曲線
は下のようなグラフになります。
ただし、a=-2, b=0 の場合です。
ただし、あくまで、x,yは(Z/pZ)*の要素、つまり、p(標数)で割ったあまりの値(整数)になっているはずなので、曲線ではなくて、点がプロットされている感じにはなります。
●楕円曲線暗号の計算の仕組み
さあここまで、楕円曲線の式だとか、グラフだとか説明してきました。
どんな計算が行われているのでしょうか?
●楕円曲線の加算について(楕円加算)
楕円曲線では、点と点の加算を定義します(楕円加算)。
具体的にどんな加算なのかというと、
1、点Pと点Qを加算する場合、点Pと点Qを結ぶ直線を引き、楕円曲線との好転を求める。
2、その交点とx軸に関して対称な楕円曲線上の点を点Pと点Qの加算と定義する。
といったものです。ざっくり図にすると、
こんな感じです。青丸が点Pと点Qの加算の結果になります。
●楕円曲線上の2倍加算について
先ほどは、2つの異なる点の加算を定義しましたが、今回は同じ点を加算した場合、則ち、2倍加算した場合の計算についてまとめていきます。
点Pの2倍加算の手順は、
1、点Pの接線を引く
2、楕円曲線との交点を求める
3、その交点とx軸に対して、対称な楕円曲線上の点を求める。
4、その点をPの2倍加算である2Pとして定義する。
青丸を点Pとした時、水色丸を点Pの2倍加算である2Pとします。
●楕円曲線暗号の計算の仕組み
で、この楕円加算を使って計算をしていくのですが、どうやって計算していくのでしょうか?
手順としては、
1、p(標数),a,bを決める。基準点Gを決める。
2、点Gと点Gの2倍加算である、点2Gを求める
3、2の行為をn回(秘密鍵の値)繰り返す
4、nGを公開鍵の値として取り出す
です。点Gに対して、先ほど紹介した2倍加算をn回(秘密鍵の値)分繰り返し、nGを公開鍵として取り出します。
nが大きくなればなるほど、nG、Gから、nを求めるのが難しくなります。つまり、公開鍵から秘密鍵を求めるのを困難にしています。
楕円曲線上の離散対数問題というものを利用しています。楕円曲線上の離散対数問題を説明するのは大変なので、離散対数問題を説明すると、
離散対数問題とは、例えば、
3^k = 6 mod 7 (6 mod 7とは,7で割ったときにあまりが6になる値という意味)
を満たすkを求めよ
みたいな問題です。有限体{0,1,2,3,4,5,6}の中であれば、答えは4です。確認してみてください。
これは具体的な解法があるわけではないので、手計算で求めることになります。
これは、k=4で済みましたが、これを巨大な数字にすれば、スパコンでも解くのはしんどくなります。
先ほどのGを3に、nGを6 mod 7、nをk に置き換えてみれば、を求めるのがしんどくなるのがわかるかと思います。
●まとめ
以上、楕円曲線暗号について、ざっくり紹介してきました。
まとめると、楕円曲線暗号は、公開鍵から秘密鍵を割り出せないようにするための手法です。
そのために、楕円曲線の2倍加算、楕円曲線上の離散対数問題を用いて、秘密鍵を求めるのを難しくしています。
ああ、もっと代数学真面目に勉強しとけば良かった笑