5. 楕円曲線3
・定数として、ジェネレーターポイント (点)を決めます。
-SECp256k1の場合: G = (x, y)
x = 55066263022277343669578718895168534326250603453777594175500187360389116729240
y = 32670510020758816978083085130507043184471273380659243275938904335757337482424
・ G + G + G + G = 4G のようにGを複数回足し合わせると擬似的な掛け算ができます。
・秘密鍵の整数をGに掛けるとできる点が公開鍵である。
・例:秘密鍵=3 G = 緑の点と想定
* 2G + G = 3G
6. 署名時のアルゴリズム
・楕円曲線の場合、 r と s という2つの値を合わせて「デジタル署名」と言います。
・生成アルゴリズム: (楕円曲線の方程式は基本的に 大文字=点、小文字=整数を表します。
- r = Rx
= kG mod p
- s = k-1
(z + dr) mod n
-G, p, n は定数、 z は署名したいメッセージのハッシュ、 d は秘密鍵(整数)
-k が秘密鍵のような乱数で全ての取引ごとに新しく生成する必要があります。
・この2つの値と公開鍵(Q)を使って確認したい場合は下記のように確認します。
- w = s-1
mod n
- u1
= zw mod n
- u2
= rw mod n
- R = u1
G + u2
Q
- Rx
== r ならば OK、 違えば NG
7. 乱数の依存について
・秘密鍵生成時
ー弱い乱数を当てられる=秘密鍵当てられる= アウト
・署名時
ー署名のr, sを知るだけで、乱数である kが当てられれば、秘密鍵が強くても計算できます。
- d = r-1
(sk - z) mod n
-さらに、k を知らなくても、2つの異なる方程式で同じ k (よって同じ r )使っていれば計算できます。
- s1
- s2
= k-1
(z1
+ dr) - k-1
(z2
+ dr) mod n *(k と r に1と2は付かない、同じなので )
- s1
- s2
= k-1
(z1
- z2
) mod n
ー k = (s1
- s2
)-1
(z1
- z2
) mod n
・乱数の依存を少なくすることが重要