基本原理
密钥生成
\[1. N比特的素数q(N不大于哈希函数H的长度,一般为160或256)\\2. L比特的素数p,p-1是q的倍数(L为64的倍数,一般大于512)\\3.g=h^{\frac{p-1}{q}} \bmod p,其中1<h<p-1,使得g^k \equiv 1 \bmod p的最小正整数k为q,即g的指数幂在模p下有q个元素\\4.选择私钥x,0<x<q,计算y \equiv g^x \bmod p\]公钥为(p,q,g,y),私钥为(x)
签名
\[1.选择随机整数k作为临时密钥,0<k<q\\2.计算r\equiv (g^k \bmod p) \bmod q\\3.计算s\equiv (H(m)+xr)k^{-1} \bmod q\]签名结果为(r,s)
验证
\[1.计算辅助值,w=s^{-1} \bmod q\\2.计算辅助值,u_1=H(m)w \bmod q\\3.计算辅助值,u_2=rw \bmod q\\4.计算v=(g^{u_1}y^{u_2} \bmod p) \bmod q\]如果v==r,则校验成功
验证原理
\[满足g^k \equiv 1 \bmod p的最小正整数k为q,因此,g^q \equiv 1 \bmod p,对于任意x,有:g^x \equiv g^{x \bmod q} \bmod p\\因为s\equiv (H(m)+xr)k^{-1} \bmod q且w=s^{-1} \bmod q\\因此k \equiv s^{-1}(H(m)+xr) \equiv H(m)w+xrw \bmod q\\v=(g^{u_1}y^{u_2} \bmod p) \bmod q=g^{u_1}g^{xu_2} \equiv g^{H(m)w}g^{xrw} \equiv g^{H(m)w+xrw} \equiv g^k=r\]常用命令
1 |
|
针对k相关攻击
k已知
\[s\equiv (H(m)+xr)k^{-1} \bmod q\\求得x \equiv r^{-1}(ks-H(m)) \bmod q\]两次签名的r值相同,表示使用了相同的k
\[s_1\equiv (H(m_1)+xr)k^{-1} \bmod q,得:s_1k \equiv H(m_1)+xr\\同理得到:s_2k \equiv H(m_2)+xr\\由于xr相同,两式相减,得:k(s_1-s_2) \equiv H(m_1)-H(m_2) \bmod q\]求得k,进而求得x