密码学
ECDSA

ECDSA

椭圆曲线签名算法(Elliptic Curve Digital Signature Algorithm)简称 ECDSA, 是一种基于椭圆曲线的数字签名算法。

假设有通信双方 A 和 B, 已知椭圆曲线 Ep(a,b)E_p(a, b) 、基点 GGGG 的阶 nn, 要签名的消息 mm

A 首先生成自己的私钥和公钥, 即从 {1,,n1}\{1,\cdots,n-1\} 随机选择一个数 kAk_A 作为私钥, 公钥 HA=kAGH_A=k_AG

A 签名过程如下:

  • {1,,n1}\{1,\cdots,n-1\} 中选择另一个随机私钥 kk

  • 计算公钥 RR 的坐标: R=kGR = kG, 取 RRxx 坐标为 rr。 若 r=0r=0, 则重新选择一个 kk 并重新计算

  • 计算 s=k1(m+rkA)mod ns = k^{-1}(m + rk_A) \mod \ n, 若 s=0s=0, 则重新选择一个kk 并重新计算

最后组合 rrss 即为最终的签名数据。

k1k^{-1} 表示在模 nn 下的乘法逆元。

在普通的算数运算中, k1=1kk^{-1} = \frac {1} {k}。但在模运算中, 则表示如果一个数 aa 乘以另一个数 bb, 在模 nn 的情况下结果等于1, 则 bb 就是 aa 的乘法逆元。

例如: 3×5=15mod7=13 \times 5 = 15 \mod 7 = 1, 5 就是 3 在模 7 下的乘法逆元, 记为 31=53^{-1} = 5。反过来 3 也是 5 在模 7 下的乘法逆元, 记为 51=35^{-1} = 3

为了验证签名,需要将 A 的公钥 HAH_A, 消息 mm,签名数据 rrss 发送给 B

B 验证签名过程如下:

  • 计算u1=s1mmod nu_1 = s^{-1}m \mod \ n
  • 计算u2=s1rmod nu_2 = s^{-1}r \mod \ n
  • 计算P=u1G+u2HAP = u_1G + u_2H_A, 若 PPxx 坐标等于 rr 则签名有效。

证明:

P=u1G+u2HA=u1G+u2kAG=(u1+u2kA)G=(s1m+s1rkA)G=(m+rkA)s1G\begin{aligned} P &= u_1G + u_2H_A \\ &= u_1G + u_2k_AG \\ &= (u_1 + u_2k_A)G \\ &= (s^{-1}m + s^{-1}rk_A)G \\ &= (m+rk_A)s^{-1}G \end{aligned}

由于s=k1(m+rkA)mod ns=k^{-1} (m+rk_A) \mod\ n

所以P=(m+rkA)km+rkAG=kGP=(m+rk_A) \frac {k}{m+rk_A}G = kG, 因此如果签名正确, 则 PPxx 坐标等于 rr


以一个实际的例子介绍 ECDSA 签名过程:

已知椭圆曲线 E17(2,3):y2=x3+2x+3E_{17}(2,3): y^2=x^3+2x+3

Curve:
a
b
Mod:
p
P:
x
y
Q:
x
y
P + Q:
x
y
有效点数量: 1(包括无穷远点)
P: (5, 6)
阶: 0
子群:

选择基点 G=(5,6)G=(5, 6), GG 的阶 n=22n=22, 要签名的消息 m=33m = 33

A 签名

  • [1,21][1, 21] 选择 7 作为私钥,则公钥 H=kG=7(5,6)=(9,6)H=kG=7(5, 6)=(9, 6)
  • [1,21][1, 21] 选择随机数 k=5k=5
  • 计算 P=kG=5(5,6)=(2,7)P=kG = 5(5, 6) = (2, 7), 得到 r=2r=2
  • 计算s=k1(m+rkA)mod n=9(33+27)mod22=423mod22=5s = k^{-1} (m+rk_A) \mod\ n = 9 * (33 + 2 * 7) \mod 22 = 423 \mod 22 = 5
  • 发送(r,s)(r, s) 、A 的公钥HAH_A、消息mm 给 B

B 验证签名

  • 计算u1=s1mmodn=933mod22=11u_1=s^{-1}m \mod n = 9 * 33 \mod 22 = 11
  • 计算u2=s1rmodn=92mod22=18u_2 = s^{-1}r \mod n = 9 * 2 \mod 22 = 18
  • 计算R=u1G+u2HA=11(5,6)+18(9,6)=(16,0)+(12,15)=(2,7)R = u_1G + u_2H_A = 11(5, 6) + 18(9, 6) = (16, 0) + (12, 15) = (2, 7)
  • RRxx 坐标等于 rr, 签名有效
Copyright © 2025 HeapUp