椭圆曲线签名算法(Elliptic Curve Digital Signature Algorithm)简称 ECDSA
, 是一种基于椭圆曲线的数字签名算法。
假设有通信双方 A 和 B, 已知椭圆曲线 Ep(a,b) 、基点 G、 G 的阶 n, 要签名的消息 m。
A 首先生成自己的私钥和公钥, 即从 {1,⋯,n−1} 随机选择一个数 kA 作为私钥, 公钥 HA=kAG
A 签名过程如下:
-
在{1,⋯,n−1} 中选择另一个随机私钥 k
-
计算公钥 R 的坐标: R=kG, 取 R 的 x 坐标为 r。 若 r=0, 则重新选择一个 k 并重新计算
-
计算 s=k−1(m+rkA)mod n, 若 s=0, 则重新选择一个k 并重新计算
最后组合 r 和 s 即为最终的签名数据。
k−1 表示在模 n 下的乘法逆元。
在普通的算数运算中, k−1=k1。但在模运算中, 则表示如果一个数 a 乘以另一个数 b, 在模 n 的情况下结果等于1, 则 b 就是 a 的乘法逆元。
例如: 3×5=15mod7=1, 5 就是 3 在模 7 下的乘法逆元, 记为 3−1=5。反过来 3 也是 5 在模 7 下的乘法逆元, 记为 5−1=3。
为了验证签名,需要将 A 的公钥 HA, 消息 m,签名数据 r 和 s 发送给 B
B 验证签名过程如下:
- 计算u1=s−1mmod n
- 计算u2=s−1rmod n
- 计算P=u1G+u2HA, 若 P 的 x 坐标等于 r 则签名有效。
证明:
P=u1G+u2HA=u1G+u2kAG=(u1+u2kA)G=(s−1m+s−1rkA)G=(m+rkA)s−1G
由于s=k−1(m+rkA)mod n
所以P=(m+rkA)m+rkAkG=kG, 因此如果签名正确, 则 P 的 x 坐标等于 r。
以一个实际的例子介绍 ECDSA
签名过程:
已知椭圆曲线 E17(2,3):y2=x3+2x+3
选择基点 G=(5,6), G 的阶 n=22, 要签名的消息 m=33
A 签名
- 在 [1,21] 选择 7 作为私钥,则公钥 H=kG=7(5,6)=(9,6)
- 在 [1,21] 选择随机数 k=5
- 计算 P=kG=5(5,6)=(2,7), 得到 r=2
- 计算s=k−1(m+rkA)mod n=9∗(33+2∗7)mod22=423mod22=5
- 发送(r,s) 、A 的公钥HA、消息m 给 B
B 验证签名
- 计算u1=s−1mmodn=9∗33mod22=11
- 计算u2=s−1rmodn=9∗2mod22=18
- 计算R=u1G+u2HA=11(5,6)+18(9,6)=(16,0)+(12,15)=(2,7)
- R 的 x 坐标等于 r, 签名有效