密钥由取值在 1…n−1 范围内的私有标量 d 和公开点 Q = d·G 组成,其中 G 是曲线的基点,n 是它的素数阶。对哈希 z 签名时,签名者选取秘密 nonce k,令 r 为 k·G 的 x 坐标对 n 取模的结果,并计算 s = k⁻¹·(z + r·d) mod n;验证者计算 u₁ = z·s⁻¹ 和 u₂ = r·s⁻¹,并检查 u₁·G + u₂·Q 的 x 坐标是否等于 r(FIPS 186-5 §6.4)。哈希会被截断为 n 的位长,因此 P-256 搭配 SHA-512 时只使用哈希最左边的 256 位。
常见标识符:X.509 中 ecdsa-with-SHA256 为 1.2.840.10045.4.3.2(SHA-384:…4.3.3,SHA-512:…4.3.4);JOSE 中为 ES256、ES384、ES512 和 ES256K;COSE 中为 −7、−35、−36 和 −47;TLS 1.3 中为 ecdsa_secp256r1_sha256(0x0403)。常用曲线是 P-256、P-384、P-521,区块链则使用 secp256k1。
同一个签名有两种编码形式:定长的原始 r‖s(P-256 为 64 字节;用于 JOSE、WebCrypto、COSE),以及由两个 INTEGER 组成的 ASN.1 DER SEQUENCE(P-256 为 70~72 字节;用于 X.509、TLS、OpenSSL、Java)。对于每个有效的 (r, s),(r, n − s) 同样能通过验证,因此区块链要求使用 low-S 签名。
nonce 是薄弱环节:重复或略有偏差的 k 都会暴露私钥,因此现代库会确定性地派生它(RFC 6979,已获 FIPS 186-5 §6.3.2 认可),或者采用对冲(hedged)方式生成。在 Apple M4 Max 的单个核心上,OpenSSL 3.6.5 每秒约可完成 87,000 次 P-256 签名和 29,000 次验证。NIST IR 8547(初始公开草案)提议在2035年之后禁止任何安全强度的 ECDSA,因为 Shor 算法能够破解它。