ECDSA公開鍵をシリアライズする方法はSEC(Standard for Efficieint Cryptography)フォーマットと呼ばれる
点P(x, y) に対する非圧縮SECフォーマットを生成する方法は以下
以下のような文字列になる
04ffe558e388852f0120e46af2d1b370f85854a8eb0841811ece0e3e03d282d57c315dc72890a4f10a1481c031b03b351b0dc79901ca18a00cf009dbdb157a1d10
点P(x, y) に対する圧縮SECフォーマットを生成する方法は以下
y座標をシングルバイト(偶数か奇数かのみを示す)に圧縮することになるので圧縮SECフォーマットと呼ぶ
上記を満たす(x, y) では、(x, -y)も式を満たす(y**2なので)
さらに有限体では以下となる
つまり任意のxに対して、y座標はyもしくは、(p-y)になる必要がある
p(位数)は2より大きい素数(奇数)となるので、yが偶数の場合はp-yは奇数になり、yが奇数の時はp-yは偶数になる
となるyを求める必要がある(平方根を求める必要がある)
数学的に表すと以下のようになる
secp256k1(ビットコインの楕円曲線暗号)は p % 4 = 3 を満たす
これは (p + 1) % 4 = 0、つまり (P + 1) / 4 は整数となる
wの値を求めるためにフェルマーの小定理(w**(p-1) % p = 1)を利用する
w**2 = w**2 * 1 = w**2 * w**(p-1) = w**(p+1)
w = w**(p+1)/2 = w**2(p+1)/4 = v**(p+1)/4
(p+1)/4 は整数なので、secp256k1において、w**2 = v, w = v**(p+1)/4 が成り立つ
この式でwの値のうち1つが求まり、もう一つの解は p - w となる
署名(rとs)をシリアライズする標準をDERフォーマット(Distinguished Encoding Rules)と呼ぶ
DERフォーマットの例
3045022037206a0610995c58074999cb9767b87af4c4978db68c06e8e6e81d282047a7c60221008ca63759c1157ebeaec0d03cecca119fc9a75bf8e6d0fa65c841c8e2738cdaec
SECフォーマットを16進数(1文字あたり4ビット)で表すと長くなる。
→Base64(1文字あたり6ビット、64進数)を使うと短くなるが似た文字がわかりづらい
(0とO、lとI、-と_)
→Base58(Base64から上記の6文字を除外、58進数)でエンコードする
SECフォーマットを使わないことでアドレスを33バイト(圧縮の場合)から20バイトに短縮できる
秘密鍵をシリアライズした形式をWIF(ウォレットインポート形式)と呼ぶ