ECDSAElliptic Curve Digital Signature Algorithm)是基于椭圆曲线的 数字签名 算法,用 私钥 对消息摘要生成 (r, s) 签名,再用 公钥 验证签名是否匹配。

核心问题

ECDSA 解决的是“如何用较短密钥生成可公开验证、难以伪造的签名”的问题。它的安全性来自一个单向关系:给定私钥整数 d 和公开基点 G,计算公钥点 Q = dG 很容易;但给定 QG,反推出 d 在计算上不可行。

这里的 dG 不是普通乘法,而是 椭圆曲线标量乘法:把曲线点 G 按椭圆曲线点加法重复加 d 次。

核心机制

一条 ECDSA 曲线会公开约定若干参数:有限域大小 p、曲线方程参数 ab、基点 G、基点阶 n。常见的 P-256secp256k1 都是一组固定公开参数。

密钥结构是:

私钥 d:1 到 n-1 之间的随机大整数
公钥 Q:Q = dG,是曲线上的一个点

签名时:

e = H(m)                         # 消息 m 的摘要
k = 每次签名使用的一次性数        # 1 <= k < n
R = kG = (x1, y1)                # 曲线点
r = x1 mod n
s = k^-1 * (e + r*d) mod n
 
signature = (r, s)

其中 r 可以理解为“一次性点 kG 的横坐标摘要”,s 则把消息摘要 e、私钥 d、一次性数 kr 绑在一起。P-256 的 raw 签名常见表示是 r || s,也就是两个 32 字节大整数拼接成 64 字节。

验签时:

e = H(m)
w  = s^-1 mod n
u1 = e*w mod n
u2 = r*w mod n
X  = u1*G + u2*Q
 
通过条件:X 的横坐标 mod n 等于 r

验签公式只用 公钥 Q,不用 私钥 d。如果签名合法:

u1*G + u2*Q
= e*s^-1*G + r*s^-1*(dG)
= s^-1*(e + r*d)G
= kG

所以验签方算出的点会回到签名时的 R = kG,横坐标自然能对上 r。攻击者不知道 d,就很难构造出能让这个等式成立的 (r, s)

工程用途

  • 固件和软件更新:发布侧用 ECDSA 签名,设备或客户端用内置公钥 验签
  • 证书体系:证书、证书链和 TLS 握手可以使用 ECDSA 签名。
  • 区块链交易:私钥签名表达账户或地址的授权,常见曲线是 secp256k1
  • 离线授权文件:设备只需要内置公钥和验签算法,不需要接触私钥。

常见实现细节包括曲线选择、哈希算法、签名编码格式、低 s 规范化、随机数来源和密钥存储。OpenSSL、云 KMS 等常返回 DER 编码签名,嵌入式库可能要求 raw r || s 格式,需要显式转换。

边界与常见坑

  • k 不能重复或可预测:两次签名复用同一个 k 会让攻击者通过代数消元求出私钥 d
  • RFC 6979 是确定性取 k 的方案:它用私钥和消息摘要派生 k,避免低质量随机数导致私钥泄露;同一私钥签同一消息会得到相同签名。
  • 签名编码不是算法本身:DER、raw r || s、base64 只是表示格式,验签前必须转成库期望的格式。
  • 曲线、哈希和公钥必须匹配:P-256 公钥不能拿去验 P-384 签名,错误哈希也会导致验签失败。
  • 验签成功不等于业务授权:ECDSA 只能证明签名和公钥匹配,还要检查签发方、有效期、用途和撤销状态。

相关术语