SM2国密算法:数字签名
SM2国密算法:数字签名
SM系列是我国的国产密码算法,其中SM1、SM7、SM9算法暂未公开,目前公开的算法主要为SM2(中国的ECC)、SM3(中国的SHA-256)、SM4(中国的AES)。国密算法的基础及其与国际商密算法的对应关系如下图所示。
今天我们要讲的就是SM2中的数字签名算法。
SM2:基本参数
SM2算法基于椭圆曲线公钥算法,和ECC是一样的,不过国密SM2规范中给出了推荐曲线和参数,一般而言,我们不需要自定义另外的曲线。
SM2:数字签名
SM2数字签名的主要流程如下图所示。
输入数据解读:
- M MM:待签名消息
- P A P_APA :用户A的公钥
- d A d_AdA :用户A的私钥,P A P_APA 和d A d_AdA 都是椭圆曲线上的点。
- Z A Z_AZA :使用SM3杂凑函数计算的杂凑值,S M 3 ( E N T L A ∣ ∣ I D A ∣ ∣ a ∣ ∣ b ∣ ∣ x G ∣ ∣ y G ∣ ∣ x A ∣ ∣ y A ) SM3(ENTL_A||ID_A||a||b||x_G||y_G||x_A||y_A)SM3(ENTLA ∣∣IDA ∣∣a∣∣b∣∣xG ∣∣yG ∣∣xA ∣∣yA )(注意里面的所有值均为比特串表示)。
后面的值我们知道,前面两个值是什么东西?
- 在标准文档内,消息M要求以国家标准GB/T 1988-1998《信息技术信息交换用七位编码字符集》中的规定编码为比特串,对该编码感兴趣的同学可以自行查找资源或者参阅以下网页:
https://www.doc88.com/p-9428282999372.html?r=1
个人感觉这个编码和ASCII/UTF-8差别不大。除了¥和$需要在国内/国际上做出区分。 - I D A ID_AIDA :用户A的可辨别标识。SM2标准文档中并未给出该值的获取方式,不过在另一篇文档GM/T 0009-2012《SM2密码算法使用规范》中第10小节中规定了I D A ID_AIDA 的默认值为:
31323334353637383132333435363738 31323334 35363738 31323334 3536373831323334353637383132333435363738 - E N T L A ENTL_AENTLA :I D A ID_AIDA 的比特长度,使用2 22字节表示。
例如对于上述默认值,其比特长度为128 128128,十六进制表示为80 8080,故E N T L A ENTL_AENTLA 的十六进制表示为0080 00800080
有了Z A Z_AZA 、M MM、P A P_APA 、d A d_AdA 这四个原始数据之后,我们就可以根据图解,一步一步来解读SM2的数字签名过程了:
- 计算M ˉ = Z A ∣ ∣ M \bar{M} = Z_A||MMˉ=ZA ∣∣M
- 计算哈希值e = H ( M ˉ ) e = H(\bar{M })e=H(Mˉ),并将结果转化为整数。注意,SM2中涉及到的所有哈希函数都规定使用国家密码管理局批准的密码杂凑算法,一般就为SM3杂凑算法。
- 产生一个值在1 11到n − 1 n-1n−1之间的随机数k kk,这里产生随机数需要使用的随机数发生器也规定使用国家密码管理局批准的随机数发生器。
- 计算倍点:( x 1 , y 1 ) = k G (x_1,y_1)=kG(x1 ,y1 )=kG,我们只关心x 1 x_1x1 。
- 计算r = ( e + x 1 ) ( m o d n ) r=(e+x_1)(mod\ n)r=(e+x1 )(mod n)。
如果r = 0 r=0r=0或者r + k = n r+k=nr+k=n,则需要重新选择随机出k kk,并重新计算倍点k G kGkG、x 1 x_1x1 和r rr。 - 计算s = ( ( 1 + d A ) − 1 ⋅ ( k − r ⋅ d A ) ) ( m o d n ) s=((1+d_A)^{-1}·(k-r·d_A))(mod\ n)s=((1+dA )−1⋅(k−r⋅dA ))(mod n),如果s = 0 s=0s=0,也得重新选择随机数k kk,一切都要重新计算。
- 计算得到的r rr和s ss组成对( r , s ) (r,s)(r,s),就是M MM的数字签名。将消息M MM和其数字签名( r , s ) (r,s)(r,s)一并输出。
进一步思考:在步骤⑤和⑥中,对r rr和s ss的限制条件从何而来?
笔者认为,r , s ≠ 0 r,s≠0r,s=0可能是一种规定,但是r + k ≠ n r+k≠nr+k=n是有数学依据的,否则
s = ( ( 1 + d A ) − 1 ⋅ ( k − r ⋅ d A ) = ( ( 1 + d A ) − 1 ⋅ ( k + k ⋅ d A ) = k ( m o d n ) s=((1+d_A)^{-1}·(k-r·d_A) =((1+d_A)^{-1}·(k+k·d_A)=k(mod\ n)s=((1+dA )−1⋅(k−r⋅dA )=((1+dA )−1⋅(k+k⋅dA )=k(mod n)
于是用户A的私钥完全不起作用,数字签名也就失去了它本来的意义。
SM2:签名验证
SM2的验签过程如下图所示。
用户B的原始数据为:Z A Z_AZA 、P A P_APA (这两个值对所有用户公开) 以及接收到的用户A的消息M ′ M'M′和签名对( r ′ , s ′ ) (r',s')(r′,s′)。
- 检验r ′ r'r′和s ′ s's′是否是在1 11到n − 1 n-1n−1之间的数,如果不成立,则验证不通过。
原理:签名流程中r rr和s ss都是模n nn下的运算,且规避了等于0 00的情况。 - 计算t = ( r ′ + s ′ ) ( m o d n ) t=(r'+s')(mod\ n)t=(r′+s′)(mod n)
要求t tt不能为0 00,如果t = 0 t=0t=0,则验证不通过。
原理:计算可得t = ( r ′ + s ′ ) t=(r'+s')t=(r′+s′)
= r + ( 1 + d A ) − 1 ⋅ ( k − r ⋅ d A ) =r+(1+d_A)^{-1}·(k-r·d_A)=r+(1+dA )−1⋅(k−r⋅dA )
= k ( 1 + d A ) − 1 + r − r ⋅ d A ( 1 + d A ) − 1 =k(1+d_A)^{-1}+r-r·d_A(1+d_A)^{-1}=k(1+dA )−1+r−r⋅dA (1+dA )−1
= k ( 1 + d A ) − 1 + r ( 1 − d A ( 1 + d A ) − 1 ) =k(1+d_A)^{-1}+r(1-d_A(1+d_A)^{-1})=k(1+dA )−1+r(1−dA (1+dA )−1)
= k ( 1 + d A ) − 1 + r ( 1 + d A ) − 1 =k(1+d_A)^{-1}+r(1+d_A)^{-1}=k(1+dA )−1+r(1+dA )−1
= ( k + r ) ( 1 + d A ) − 1 ( m o d n ) [ r + k ≠ n ] =(k+r)(1+d_A)^{-1}(mod\ n)[r+k≠n]=(k+r)(1+dA )−1(mod n)[r+k=n]
所以如果t = 0 t=0t=0,说明k + r = n k+r=nk+r=n,这与之前签名的过程是矛盾的,所以验证不通过。 - 和签名一样,计算M ′ ˉ = Z A ∣ ∣ M ′ \bar{M'}=Z_A||M'M′ˉ=ZA ∣∣M′,然后计算e ′ = H ( M ′ ˉ ) e'=H(\bar{M'})e′=H(M′ˉ)。
- 计算椭圆曲线点:
( x 1 ′ , y 1 ′ ) = s ′ G + t P A (x1',y1')=s'G+tP_A(x1′,y1′)=s′G+tPA 。 - 计算R = ( e ′ + x 1 ′ ) ( m o d n ) R=(e'+x_1')(mod\ n)R=(e′+x1′ )(mod n)
验证r ′ = R r'=Rr′=R是否成立,成立则验证通过,否则验证不通过。
原理:假设得到的签名是正确的,那么r ′ r'r′、s ′ s's′都应该满足签名时的式子。代入计算即得:
s ′ G + t P A = ( s ′ + t d A ) G = ( s ′ + ( r ′ + s ′ ) d A ) G s'G+tP_A=(s'+td_A)G=(s'+(r'+s')d_A)Gs′G+tPA =(s′+tdA )G=(s′+(r′+s′)dA )G
= ( s ′ ( 1 + d A ) + r ′ d A ) G =(s'(1+d_A)+r'd_A)G=(s′(1+dA )+r′dA )G
= ( k − r ′ d A + r ′ d A ) G =(k-r'd_A+r'd_A)G=(k−r′dA +r′dA )G
= k G ( m o d n ) =kG(mod\ n)=kG(mod n),等价于签名时的倍点运算。
所以R = ( e ′ + x 1 ′ ) ( m o d n ) R=(e'+x_1')(mod\ n)R=(e′+x1′ )(mod n),R RR和r ′ r'r′应该要相等,否则总会有一个环节出问题。
SM2:安全性及应用前景
SM2作为中国特色ECC,其安全性同样是基于离散对数问题。关键在于非A用户要想仅通过用户A的公钥P A = d A G P_A=d_AGPA =dA G计算得到d A d_AdA 是困难的,即椭圆曲线上的离散对数问题。
对于数字签名方面,也就是攻击者难以伪装成用户A向其他用户发送消息,保证了认证这一安全服务的安全性。
同样,SM2也比RSA快上一大截,只需要256位(国家密码局规定也是使用256位)的密钥就能比2048位密钥的RSA安全,而且还更快,因此SM2/ECC就成为了最有希望替代RSA的非对称加密算法之一。