SM2协同签名过程实例

本SM2协同签名过程理论基础如下:
1.客户端参数
客户端私钥d1,随机数生成
客户端公钥P1,根据SM2密钥生成算法由d1得到
过程参数K1,随机数生成
过程参数R1,R1 = K1*G
过程参数R1_,R1_ = K1*P2(其中P2从服务端发送过来)
签名消息m
签名随机数K = K1 + K2*d1
签名时使用的用户公钥即为公共公钥P
(x1,y1)= K*G
签名r,r = (H(M)+x1)mod n(其中H(M)为SM2算法标准定义)
签名过程参数s_,s_ = (K1+r)/d1 mod n
签名s,s = t -r (其中t从服务端发送过来)
最终完整签名(r,s),使用公钥P进行验签通过即可

2.服务端参数
服务端私钥d2,随机数生成
服务端公钥P2,根据SM2密钥生成算法由d2得到
过程参数K2,随机数生成
过程参数R2,R2 = K2*P1(其中P1从客户端发送过来)
过程参数R2_,R2_ = K2*G
签名过程参数t,t =(s_+K2)/d2 mod n (其中S_从客户端发送过来)

3.公共参数
公共公钥P,P = (d1*d2-1)*G,从计算过程看协同签名实际私钥其实就是(d1*d2-1),但这个私钥无法被客户端或服务端完全掌握,客户端只知道d1,服务端只知道d2

4.协同签名过程实例
(1)SM2参数《GMT 0003.5-2012 SM2 椭圆曲线公钥密码算法第5部分:参数定义》
    n = FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123
    id = 31323334353637383132333435363738

(2)客户端公私钥对参数d1和P1
    d1 = 8778734DD0BE82BEDBC246412B8CFA307F70F0A754863295AA5B68130BE6FCF5
    P1 = d1*G = 5B396BF90F61C6652BF4DC322B86397FA1F8DE81CFC837E7895FB811C31773112CD44FA07C8A342CB1F98A03BEA5CBB7CC1D5F1C83A66034ADB17D2CC5B99932

(3)服务端公私钥对参数d2和P2
    d2 = B09557F5DF806C6D8D74D98B43651108A5F679BDF7EB15B8E0E1608F6E3C7BF4
    P2 = d2*G = EAE093F37275C37493076EE367AE848DD14CC539DE4FF42EAE431F6198ECECFA76127744D88CBAB5C10C16474416E34825D72F101CB17C853D4B843F5E5CB49E
    
(4)在客户端和服务端产生共同公钥P(相互发送P1和P2即可)
    P = d1*d2*G - G
        =(d1*d2-1)*G
        = 805A6A825CC0157ED74474619CABBB70A7F58124A029D6060B2213F4C4ED55AC * G
        = 1F340F33707E25CF4EE141B60FEB82208FEC740D670B9BAE376CC9975AF2C6AB13600009F706CD228C1223FCEBFDB9F94E1B629CFE33284B338D4727C0C4253D
        
(5)在客户端生成协同签名参数K1、R1和R1_
    K1 = EA26ED554E8084D92BF837B8EDD57AA05C4EFA9F21FC3C36858E81B07DBFEEB1(随机数)
    R1 = K1*G = 7B52F11AA44353DF4CA4BF3E2801576D44793A7CC636FB571689C2995C0B0D22F90355DF81A9753765F5A3D12F2D281C24765FE61DBB33BEE3C3FB35F1FF5457
    R1_ = K1*P2 = K1*d2*G = 90E9A631C7B4ADC6211CAC90FE9585DC4E755BD0FCAAD647DB8C4BFB0C7F5522 *G
        = 105ACE4C2E24864F8928EA2513F814E09BF5960FF057172B5C348BB621A4C760638F69D5F9378743CF6656813C2F7DD30A6420AAF718B0887AB794BCCFCB488E
        
(6)客户端发送R1和R1_到服务端,服务端验证R1*d2是否等于R1_,若相同则继续否则错误退出
        
(7)在服务端生成协同签名参数K2、R2和R2_
    K2 = A1FE69D4FA0467EDBFC91914D13FF8F2086851ADC0C5EC029412EC946930F683(随机数)
    R2_ = K2*G = B15D272FFD81396A6AA886441BB206BC831D5257608948C624F1666B954804FDF7F3143088AB2825FC430C373800A9832CACD2DEA9B6D5188789C2F4318563AC
    R2 = K2*P1 = K2*d1*G = 1BCA1F350734ABB060575E3F636C03D7F97E08CCF709BCEA2461DF74A3055301 *G
        = 5DC7E14CC8A958B6D600F74903C5929AC5D7C3F28DDD8874745AD2D20C71B14E1B81190AEFB072C07CE046E75B859C169DBCECA990AFAE40FD5FD75D47AA9A66
        
(8)服务端发送R2_和R2到客户端,客户端验证R2是否等于d1*R2_,若相同则继续否则错误退出

(9)客户端对消息m签名
    m = 706C61696E74657874(plaintext)
    K = K1 + K2*d1 mod n = 5F10C8B55B530898C4F95F851417E78E3C92400F73FF3F556346D1BE6F0008F(这里SM2签名随机数由K1、K2和d1决定)
    r = 9616EE6DEABE56388218645283D660E218780AA7883E1C3D48C5B10D857F351E
    s_ = (K1+r)/d1 mod n = 803DDBC4393EDB11AE109C0B71ABDB8302C325DB887453487A983EB4C969E2AC /d1 mod n
        = D87AA01084FA841011ABCCC73108FFA05F1EEDE2B0640899AC2F301B0916A85E
        
(10)客户端将签名s_发送给服务端,服务端进行签名
    t = (s_+K2)/d2 mod n =  7A7909E67EFEEBFDD174E5DC0248F892F58360254F63EF70EC8628A638725DBE /d2 mod n
        = F9515D545CC8DD5090F4A084A0E2F6708961021509683329B1FACD71AF77BD3B
        
(11)服务端将t发送给客户端,客户端计算得到s,从而得到最后的签名(r,s)
    s = (t-r)mod n = 633A6EE6720A87180EDC3C321D0C958E70E8F76D812A16EC69351C6429F8881D

(12)使用公钥P进行验签通过
    私钥805A6A825CC0157ED74474619CABBB70A7F58124A029D6060B2213F4C4ED55AC
    公钥1F340F33707E25CF4EE141B60FEB82208FEC740D670B9BAE376CC9975AF2C6AB13600009F706CD228C1223FCEBFDB9F94E1B629CFE33284B338D4727C0C4253D
    签名9616EE6DEABE56388218645283D660E218780AA7883E1C3D48C5B10D857F351E633A6EE6720A87180EDC3C321D0C958E70E8F76D812A16EC69351C6429F8881D

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游鲦亭长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值