本文へスキップ
ecdsa.com

点圧縮(point compression)

楕円曲線上の点を、両方の座標ではなく x 座標と y の 1 ビットで表すエンコード方法で、デコード時に平方根の計算が必要になる代わりに、公開鍵のサイズをほぼ半分にできます。
別表記compressed public keycompressed pointuncompressed point0x04 prefix

SEC 1 §2.3.3 は、ほぼあらゆる場面で使われるオクテット列を定義しています。非圧縮形式は 0x04 ‖ x ‖ y(P-256 と secp256k1 では 65 バイト、P-384 では 97 バイト、P-521 では 133 バイト)、圧縮形式は 0x02 ‖ x または 0x03 ‖ x で、プレフィックスが y の偶奇を示します(33、49、67 バイト)。圧縮された点をデコードするには、曲線の方程式を y について解きます。デコーダーは、有効な y が存在しない x を拒否しなければなりません。

どちらの形式に出会うかは、エコシステムによって異なります。X.509 の SubjectPublicKeyInfo はほぼ常に非圧縮形式の点を格納し(RFC 5480 は非圧縮形式への対応を必須とし、圧縮形式への対応を任意としています)、最近のブラウザーの WebCrypto は、ECDSA 鍵の raw インポートでどちらの形式も受け付けます。Bitcoin は 2012年ごろから 33 バイトの圧縮形式の鍵を使っており、Ethereum は 0x04 プレフィックスを除いた x ‖ y の 64 バイトからアドレスを導出します。JWK は常に x と y を別々のメンバーとして持ちます。

エドワーズ形式とモンゴメリ形式のエンコーディングは、構造上もともと圧縮されています。Ed25519 の公開鍵は 32 バイトの y 座標で、最上位ビットに x の符号が入ります。X25519 は u だけを送信します。33 バイトの鍵と 65 バイトの鍵の取り違えは、「invalid public key」や「point is not on the curve」というエラーのよくある原因です。

規格と参考文献

すべての用語