楕円曲線暗号の公開鍵は(x, y)形式の一つの座標
ECDSA公開鍵をシリアライズする方法はSECフォーマット(Standards for Efficient Cryptography)と呼ばれる
1. プレフィックスバイトは0x04
2. 32バイトのビッグエンディアン整数としてx座標を追加
3. 32バイトのビッグエンディアン整数としてy座標を追加
圧縮SECフォーマットの場合、yが偶数の場合は0x02とし、奇数の場合は0x03とする。
def sec(self, compressed=True): if compressed: if self.y.num % 2 == 0: return b'\x02' + self.x.num.to_bytes(32, 'big') else: return b'\x03' + self.x.num.to_bytes(32, 'big') else: return b'\x04' + self.x.num.to_bytes(32, 'big') + self.y.num.to_bytes(32, 'big')
from ecc import S256Point, PrivateKey pkey = PrivateKey(5000) p = pkey.point.sec(compressed=False).hex() print(p)
$ python3 main.py
04ffe558e388852f0120e46af2d1b370f85854a8eb0841811ece0e3e03d282d57c315dc72890a4f10a1481c031b03b351b0dc79901ca18a00cf009dbdb157a1d10