ECDSAの原理

eは秘密鍵、pは公開鍵
eG = P

ランダムな256ビットの数字k
k * G = R (x座標をr)

uG + vP = kG
kはランダムに選ばれる数字で、u, vは署名者が選ぶ

vP = (k – u)G
P = ((k-u)/v)G

eG = ((k-u)/v)G のため、 e = (k – v) / u
つまり、秘密鍵 e = (k – v) / u を満たす(u, v)の組み合わせであればどれでも良い
eは秘密鍵を知っている人のみわかる

目的は署名ハッシュと呼ぶ。署名ハッシュはzで表す。
uG + vPに当てはめると、 u = z/s, v = z/s

uG + vP = R(目的) = kG
uG + veP = kG
u + ve = k
z/s + re/s = k
(z + re)/s = k
s = (z + re)/k

k は256ビットを保証するためhash256を2回繰り返す

1. 署名(r, s)、署名対象のハッシュをz, 公開鍵をPとする
2. u = z/s, v = r/sを計算する
3. uG + vP = Rを計算する
4. Rのx座標がrと同じであれば署名は有効