理解 ECDSA 签名验证的原理确实需要一些数学背景,但我会尽量用简单的语言和直观的方式来解释为什么这些步骤可以验证签名的有效性。
签名生成的回顾
首先,回顾一下签名生成的步骤,以便更好地理解验证过程:
-
选择随机数 k:
k 是一个随机选择的数
-
计算椭圆曲线点 R:
R=k⋅G
其中 G 是椭圆曲线的基点,R=(Rx,Ry)。
-
计算 r:
r=Rxmodn
-
计算 s:
s=k−1⋅(h+xr)modn
其中 h 是消息的哈希值,x 是私钥。
签名结果是 (r,s)。
签名验证的步骤
签名验证的目标是确保签名确实是由拥有私钥的人生成的。验证步骤如下:
-
计算消息哈希值 h:
h=H(m)
其中 H 是哈希函数。
-
检查签名的有效性:
- 确保 r 和 s 都在区间 [1,n−1] 内。如果不在这个范围内,签名无效。
-
计算 w:
w=s−1modn
-
计算 u1 和 u2:
u1=h⋅wmodn
u2=r⋅wmodn
-
计算椭圆曲线点 R′:
R′=u1⋅G+u2⋅Q
其中 G 是椭圆曲线的基点,Q 是公钥。
-
验证 r:
r′=Rx′modn
如果 r′=r,则签名有效;否则,签名无效。
为什么这些步骤可以验证签名?
为了理解为什么这些步骤能够验证签名,我们需要理解一些数学关系。关键在于签名生成和验证过程中使用的椭圆曲线点运算。
1. 签名生成中的关系
在签名生成过程中,我们有:
s=k−1(h+xr)modn
2. 验证中的关系
在验证过程中,我们计算:
w=s−1modn
u1=h⋅wmodn
u2=r⋅wmodn
然后计算:
R′=u1⋅G+u2⋅Q
将 u1 和 u2 代入 R′ 的计算:
R′=(h⋅s−1modn)⋅G+(r⋅s−1modn)⋅Q
因为 s=k−1(h+xr)modn,所以:
s−1=k⋅(h+xr)−1modn
因此:
u1=h⋅k⋅(h+xr)−1modn
u2=r⋅k⋅(h+xr)−1modn
代入 R′ 的计算:
R′=(h⋅k⋅(h+xr)−1modn)⋅G+(r⋅k⋅(h+xr)−1modn)⋅Q
R′=k⋅(h⋅(h+xr)−1modn)⋅G+k⋅(r⋅(h+xr)−1modn)⋅Q
因为 Q=x⋅G:
R′=k⋅(h⋅(h+xr)−1modn)⋅G+k⋅(r⋅(h+xr)−1⋅xmodn)⋅G
R′=k⋅(h⋅(h+xr)−1modn+r⋅x⋅(h+xr)−1modn)⋅G
R′=k⋅((h+xr)⋅(h+xr)−1modn)⋅G ,这里 (h+xr)⋅(h+xr)−1=1
R′=k⋅G
我们知道在签名生成过程中,R=k⋅G,所以 R′=R。
因此:
r′=Rx′modn=Rxmodn=r
这就证明了验证过程中的计算结果 r′ 和签名中的 r 是相同的,从而验证了签名的有效性。
尽管签名生成过程中使用了随机数 k,签 名验证过程并不需要知道 k。验证过程通过一系列数学运算,利用公钥 Q、签名结果 (r,s) 和消息的哈希值 h,最终验证签名的有效性(这里:k 很重要,是什么无所谓,有就行, 之后 DKG+ ecdsa + Paillier 会用到的)。这些数学运算确保了只有拥有私钥的人才能生成有效的签名,从而保证了签名的真实性和完整性。