跳到主要内容
ecdsa.com

点压缩

只用 x 坐标再加上 y 的一位(而不是两个坐标)来编码椭圆曲线点,可使公钥大小减少约一半,代价是解码时需要计算一次平方根。
其他写法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,如果某个 x 没有有效的 y,解码器必须拒绝它。

你会遇到哪种形式取决于所在的生态:X.509 的 SubjectPublicKeyInfo 几乎总是携带未压缩点(RFC 5480 要求必须支持未压缩点,压缩点则是可选的);在现代浏览器中,WebCrypto 的 raw 导入对 ECDSA 密钥两种形式都接受;比特币大约从2012年起就使用 33 字节的压缩公钥;以太坊则根据去掉 0x04 前缀的 x ‖ y 这 64 个字节派生地址。JWK 中始终是彼此独立的 x 和 y 成员。

Edwards 和 Montgomery 编码天生就是压缩的:Ed25519 公钥是 32 字节的 y 坐标,最高位存放 x 的符号;X25519 只传输 u。33 字节密钥与 65 字节密钥混用,是“invalid public key”和“point is not on the curve”错误的常见原因。

标准与参考资料

全部术语