数字签名是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。目前主流的签名算法有RSA数字签名算法和DSA数字签名算法,而国密算法SM2也同样可以用作于数字签名算法。下面我们就来了解一下SM2算法在数字签名中的应用。
ECDSA数字签名算法
首先,SM2算法是一种基于椭圆曲线的密码算法,与ECC算法类似。而在数字签名领域中,DSA算法结合ECC,称为ECDSA数字签名算法。
对于椭圆曲线密码算法而言,最重要的是选择一条命名曲线,包括几个重要的参数:p、a、b、G(x,y)和n。而在ECDSA算法中,有三个参数很重要:
- 命名曲线。
- G,椭圆曲线的基点。
- n,相当于G基点的打点次数。
ECDSA签名算法密钥对的生成为:
- 选择一个随机数作为私钥d, 1 < d < n -1
- 基于私钥生成公钥,P(x, y) = d * G(x, y)
签名生成
下面的步骤中,M是消息,HASH(M)是对消息进行摘要运算。d为私钥,P为公钥。
- 生成一个随机数k,1 < k < n -1
- 计算(x, y) = k * G
- 计算r = x mod n
- 计算s = (k**-1 * (HASH(M) + d*r)) mod n
- 得到签名值(r, s)。
验证签名
- 将签名转化为两个数r和s,假如r和s小于1或者大于n-1,验证直接失败。
- 计算c = (s)**-1 mod n
- 计算u1 = ((HASH(M)) * c) mod n
- 计算u2 = ((r) * c) mod n
- 计算(x, y) = u1 * G + u2 * P
- 如果r = x mod n,则签名验证成功,否则失败。
SM2数字签名算法
虽然SM2也是一种椭圆曲线(EC)密码算法,但它和标准ECDSA的流程并不完全相同。
签名生成
设待签名的消息为M,为了获取消息M的数字签名(r,s),作为签名者的用户A应实现以下运算步骤:
- 置M=ZA||M;
- 计算e=Hv(M),将e的数据类型转换为整数;
- 用随机数发生器产生随机数k∈[1,n-1];
- 计算椭圆曲线点(x1,y1)=[k]G,将x1的数据类型转换为整数;
- 计算r=(e+x1)modn,若r=0或r+k=n则返回第3步;
- 计算s=((1+dA)-1·(k-r·dA))mod n,若s=0则返回第3步;
- 将r、s的数据类型转换为字节串,消息M的签名为(r,s)。
签名验证
- 检验r'∈[1,n-1]是否成立,若不成立则验证不通过;
- 检验s'∈[1,n-1]是否成立,若不成立则验证不通过;
- 置M'=ZA||M';
- 计算e'=Hv(M'),将e'的数据类型转换为整数;
- 将r'、s'的数据类型转换为整数,计算t=(r'+s')modn,若t=0,则验证不通过;
- 计算椭圆曲线点(x1',y1')=[s']G+[t]PA;
- 将x1'的数据类型转换为整数,计算R=(e'+x1')modn,检验R=r'是否成立,若成立则验证通过;否则验证不通过。
SM2数字签名算法和ECDSA数字签名算法的不同
- 对消息的处理不同,国密签名算法对消息进行了处理,然后才计算摘要。其中 ZA 的计算涉及到命名曲线参数的a、b、G、P。
- SM2数字签名算法签名生成的5、6步的运算和ECDSA的第3、4步不一样。
- 国密签名过程中,如果出现不合法的值,需要返回到第3步,重新生成随机数,直到值合法。
免责声明:素材源于网络,如有侵权,请联系删稿。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。