跳到主要内容
ecdsa.com

原始 r‖s 签名格式(IEEE P1363)

ECDSA 或 DSA 签名的定长编码:把 r 和 s 拼接起来,每个值都在左侧填充到群阶的字节长度;JOSE、COSE、WebCrypto 和许多 HSM API 都使用这种格式。
其他写法IEEE P1363raw ECDSA signaturer||sconcatenated signature

名称来自 IEEE Std 1363-2000。长度是固定的:P-256 和 secp256k1 为 64 字节,P-384 为 96 字节,P-521 为 132 字节。另一种格式是 DER:由两个最小长度的大端序 INTEGER 组成的 SEQUENCE,每个整数的最高位为 1 时前面要加一个 0x00 字节,因此 P-256 签名为 70~72 字节,长度按设计就是可变的。

使用原始格式的有:JWS 的 ES256 及同类算法(RFC 7518 §3.4)、COSE(RFC 9053 §2.1)、WebCrypto、PKCS #11 CKM_ECDSA、Windows CNG 和 Apple CryptoKit。使用 DER 的有:X.509 和 CMS、TLS CertificateVerify、WebAuthn 断言签名、OpenSSL、Java 的 SHA256withECDSA、Go 的 ecdsa.SignASN1 和 Node 的 crypto.sign()。切换选项:Node 的 dsaEncoding: "ieee-p1363"、Java 的 SHA256withECDSAinP1363Format、Python 的 encode_dss_signature 和 decode_dss_signature。

转换时必须填充:大约每 128 个签名中就有一个的 r 或 s 短于 32 字节;如果保留 DER 的符号字节或丢掉填充,就会得到 63 或 65 字节的“原始”签名,在别处验证失败。DER ⇄ 原始格式转换器可以同时显示两种形式。

标准与参考资料

全部术语