SM2协同签名算法中随机数K的随机性对算法安全的影响
前面介绍过若持有私钥d的用户两次SM2签名过程中随机数k相同,在对手获得两次签名结果Sig1和Sig2的情况下,可破解私钥d。
具体见SM2签名算法中随机数K的随机性对算法安全的影响_sm2关闭随机数-CSDN博客
另关于SM2协同签名过程,具体见SM2协同签名过程实例_协同签名流程-CSDN博客
可知在SM2协同签名的客户端和服务端也均使用随机数,那么重复使用随机数值是否对SM2协同签名产生私钥威胁?
答案是肯定的,重复使用随机数对SM2协同签名密钥安全存在重大威胁。这里我们做一些理论推导即可得到其与SM2签名过程中重复随机数K破解私钥d的情况其实是一致的。
客户端数据信息:
(1)客户端私钥d1
(2)客户端公钥P1 (P1 = d1 * G)
(3)客户端随机数K1
(4)客户端过程参数R1 (R1 = K1 * G)
(5)客户端过程参数R1_ (R1_ = K1 * P2)
(6)公共公钥P (P= d1 * P2 - G)
(7)客户端过程参数(x1,y2)= R1 + R2
(8)协同签名r = (H(M)+x1) mod n
(9)客户端过程参数s_ = (K1 + r)/d1 mod n
(10)协同签名s = t - r
(11)协同签名(r,s)
服务端数据信息:
(1)服务端私钥d2
(2)服务端公钥P2 (P2 = d2 * G)
(3)服务端随机数K2
(4)服务端过程参数R2_ (R2_ = K2 * G)
(5)服务端过程参数R2 (R2 = K2 * P1)
(6)公共公钥P (P= d2 * P1 - G)
(7)服务端过程参数t = (s_ + K2)/d2 mod n
首先证明客户端和服务端计算得到的公共公钥P是相同的。
在客户端 d1 * P2 - G = d1 * d2 * G - G = (d1*d2-1)G
在服务端 d2 * P1 - G = d2 * d1 * G - G = (d1*d2-1)G
然后分析s的具体结构,可以看到与SM2签名算法也是一致的,可以理解为随机数K=(k1+k2*d1),私钥d=(d1*d2-1)。
s = t - r = (k1+k2*d1+r)/d1*d2 -r = [(k1+k2*d1)-r(d1*d2-1)]/[(d1*d2-1)+1] mod n
到这里,我们看到协同签名其实就是客户端和服务器共同构造随机数K=(k1+k2*d1),私钥d=(d1*d2-1)的SM2签名,但客户端和服务端各自只掌握其中一部分信息。若k1和k2同时存在重复时,随机数K就是重复的,则私钥d可能泄露。