架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6982|回复: 0

[C] SM2数字签名验签的原理

[复制链接]
发表于 2019-6-26 10:09:45 | 显示全部楼层 |阅读模式
SM2是基于椭圆曲线的数字签名算法,关于椭圆曲线的解释可以常见前一篇关于椭圆曲线的微博,下面概要的介绍一下SM2签名的过程。
对于要签名的信息ee,这个是原始信息经过一定的处理通过散列函数得到的,散列算法用的是国密SM3算法,这个过程也略过,只介绍重点的签名和验证的过程。

1、签名的过程
设GG是椭圆曲线上的参考点,dAdA是私钥,PAPA是公钥,PA=dA∗GPA=dA∗G
对ee进行数字签名得到签名结果(r,s)(r,s),计算过程是:
首先选取随机数kk,当然,这个数的选择是有约束条件的,现在暂时不管
计算r=e+x1r=e+x1,其中(x1,y1)=k∗G(x1,y1)=k∗G
计算s=(1+dA)−1∗(k−r∗dA)s=(1+dA)−1∗(k−r∗dA)
可以看出前面是用私钥进行的。

2、签名验证的过程
验证签名就是利用得到的签名、公钥、椭圆曲线参数等对签名进行验证,验证主要步骤是:
首先计算t=r+st=r+s,如果t=0t=0那么就表明没有通过。
然后通过tt与ss计算曲线上的点(x1,y1)=s∗G+t∗PA(x1,y1)=s∗G+t∗PA
再计算R=x1+eR=x1+e,然后验证RR与rr是不是相等,如果相等则表明验证通过。

3、验证的原理
为什么这样能完成验证,我们不妨推导一下:
(x1,y1)=s∗G+t∗PA           =s∗G+(r+s)∗PA            =s∗G+(r+s)∗dA∗G=(1+dA)∗s∗G+r∗dA∗G=(1+dA)∗(1+dA)−1∗(k−r∗dA)∗G+r∗dA∗G=(k−r∗dA)∗G+r∗dA∗G=k∗G(x1,y1)=s∗G+t∗PA           =s∗G+(r+s)∗PA            =s∗G+(r+s)∗dA∗G=(1+dA)∗s∗G+r∗dA∗G=(1+dA)∗(1+dA)−1∗(k−r∗dA)∗G+r∗dA∗G=(k−r∗dA)∗G+r∗dA∗G=k∗G
可以看出依据公钥得到的椭圆曲线上的这个点和签名时的点是一致的。
然后再由这个x1x1和收到的信息相加,看是否与发送的签名rr是否相符,相符就通过了。
---------------------
作者:leowang666
来源:CSDN
原文:https://blog.csdn.net/hugewaves/article/details/59205914
版权声明:本文为博主原创文章,转载请附上博文链接!





上一篇:【原创】Google AdSense 电汇收款教程
下一篇:angular 事件绑定/属性绑定 @HostListener ,@HostBinding
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-25 08:05

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表