SM2国密算法:数字签名

最近上课的时候刚好研究到了SM2,所以顺便在CSDN上混更一下~

SM2:引入

SM系列是我国的国产密码算法,其中SM1、SM7、SM9算法暂未公开,目前公开的算法主要为SM2(中国的ECC)、SM3(中国的SHA-256)、SM4(中国的AES)。
国密算法的基础及其与国际商密算法的对应关系如下图所示。
在这里插入图片描述今天我们要讲的就是SM2中的数字签名算法。

SM2:基本参数

SM2算法基于椭圆曲线公钥算法,和ECC是一样的,不过国密SM2规范中给出了推荐曲线和参数,一般而言,我们不需要自定义另外的曲线。
在这里插入图片描述

SM2:数字签名

SM2数字签名的主要流程如下图所示。
在这里插入图片描述
输入数据解读:
M M M:待签名消息 ① ^①
P A P_A PA:用户A的公钥
d A d_A dA:用户A的私钥, P A P_A PA d A d_A dA都是椭圆曲线上的点。
Z A Z_A ZA:使用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_A IDA:用户A的可辨别标识。SM2标准文档中 ② ^② 并未给出该值的获取方式,不过在另一篇文档GM/T 0009-2012《SM2密码算法使用规范》中第10小节中规定了 I D A ID_A IDA的默认值为:
31323334353637383132333435363738 31323334 35363738 31323334 35363738 31323334353637383132333435363738
E N T L A ENTL_A ENTLA I D A ID_A IDA的比特长度,使用 2 2 2 字节表示。
例如对于上述默认值,其比特长度为 128 128 128,十六进制表示为 80 80 80,故 E N T L A ENTL_A ENTLA的十六进制表示为 0080 0080 0080
②此处的标准文档指GB/T 32918-2016《信息安全技术SM2椭圆曲线公钥密码算法》,该文档共分为5个部分:总则、数字签名算法、密钥交换协议、公钥加密算法、参数定义。后面部分的“标准文档”均为此意。 该文档及其他国密标准可以在GMSSL中下载:https://www.gmssl.cn

有了 Z A Z_A ZA M M M P A P_A PA d A d_A dA这四个原始数据之后,我们就可以根据图解,一步一步来解读SM2的数字签名过程了:
①计算 M ˉ = Z A ∣ ∣ M \bar{M} = Z_A||M Mˉ=ZA∣∣M
②计算哈希值 e = H ( M ˉ ) e = H(\bar{M }) e=H(Mˉ),并将结果转化为整数。注意,SM2中涉及到的所有哈希函数都规定使用国家密码管理局批准的密码杂凑算法,一般就为SM3杂凑算法。
③产生一个值在 1 1 1 n − 1 n-1 n1 之间的随机数 k k k,这里产生随机数需要使用的随机数发生器也规定使用国家密码管理局批准的随机数发生器。
④计算倍点: ( x 1 , y 1 ) = k G (x_1,y_1)=kG (x1,y1)=kG,我们只关心 x 1 x_1 x1
⑤计算 r = ( e + x 1 ) ( m o d   n ) r=(e+x_1)(mod\ n) r=(e+x1)(mod n)
如果 r = 0 r=0 r=0 或者 r + k = n r+k=n r+k=n,则需要重新选择随机出 k k k,并重新计算倍点 k G kG kG x 1 x_1 x1 r r r
⑥计算 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(krdA))(mod n),如果 s = 0 s=0 s=0,也得重新选择随机数 k k k,一切都要重新计算。
⑦计算得到的 r r r s s s 组成对 ( r , s ) (r,s) (r,s),就是 M M M 的数字签名。将消息 M M M 和其数字签名 ( r , s ) (r,s) (r,s) 一并输出。

进一步思考:在步骤⑤和⑥中,对 r r r s s s 的限制条件从何而来?
笔者认为, r , s ≠ 0 r,s≠0 r,s=0 可能是一种规定,但是 r + k ≠ n r+k≠n r+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(krdA)=((1+dA)1(k+kdA)=k(mod n)
于是用户A的私钥完全不起作用,数字签名也就失去了它本来的意义。

SM2:签名验证

SM2的验签过程如下图所示。
在这里插入图片描述

用户B的原始数据为: Z A Z_A ZA P A P_A PA (这两个值对所有用户公开) 以及接收到的用户A的消息 M ′ M' M 和签名对 ( r ′ , s ′ ) (r',s') (r,s)
① 检验 r ′ r' r s ′ s' s 是否是在 1 1 1 n − 1 n-1 n1 之间的数,如果不成立,则验证不通过。
原理:签名流程中 r r r s s s 都是模 n n n 下的运算,且规避了等于 0 0 0 的情况。
② 计算 t = ( r ′ + s ′ ) ( m o d   n ) t=(r'+s')(mod\ n) t=(r+s)(mod n)
要求 t t t 不能为 0 0 0,如果 t = 0 t=0 t=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(krdA)
= 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+rrdA(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(1dA(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=0 t=0,说明 k + r = n k+r=n k+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)=sG+tPA
⑤ 计算 R = ( e ′ + x 1 ′ ) ( m o d   n ) R=(e'+x_1')(mod\ n) R=(e+x1)(mod n)
验证 r ′ = R r'=R r=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)G sG+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)+rdA)G
= ( k − r ′ d A + r ′ d A ) G =(k-r'd_A+r'd_A)G =(krdA+rdA)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 R R r ′ r' r 应该要相等,否则总会有一个环节出问题。

SM2:安全性及应用前景

SM2作为中国特色ECC,其安全性同样是基于离散对数问题。关键在于非A用户要想仅通过用户A的公钥 P A = d A G P_A=d_AG PA=dAG计算得到 d A d_A dA 是困难的,即椭圆曲线上的离散对数问题。
对于数字签名方面,也就是攻击者难以伪装成用户A向其他用户发送消息,保证了认证这一安全服务的安全性。
同样,SM2也比RSA快上一大截,只需要256位(国家密码局规定也是使用256位)的密钥就能比2048位密钥的RSA安全,而且还更快,因此SM2/ECC就成为了最有希望替代RSA的非对称加密算法之一。

本期内容就到这里了,我们下期再见~

  • 19
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
国密SM2是中国自主研发的一种椭圆曲线公钥密码算法,广泛应用于数字签名、密钥交换、加密等领域。下面简单介绍一下基于国密SM2数字签名技术。 数字签名是一种用于保证数字信息真实性、完整性和不可抵赖性的技术。基于国密SM2数字签名技术采用了非对称加密算法,即使用一对公钥和私钥进行加密和解密。具体流程如下: 1. 密钥生成 首先,签名方需要生成一对公钥和私钥。公钥可以公开,私钥必须保密。在国密SM2算法中,公钥的长度为256位,私钥的长度为256位,其中一部分为随机数。 2. 数字签名 数字签名的过程可以分为四步: (1)计算消息的摘要值。使用SHA-256算法计算出消息的摘要值,摘要值的长度为256位。 (2)随机数生成。生成一个随机数k,保证其在区间[1,n-1]之间,n为SM2算法中的一个大素数。 (3)计算椭圆曲线上的点。根据摘要值和随机数k计算出椭圆曲线上的点R,其中R = [k]G,G为椭圆曲线上的基点。 (4)计算数字签名。根据摘要值、随机数k、私钥d和点R计算数字签名S,其中S = (hash(m) + x(R)*d)/(1+k)^(-1) mod n,x(R)表示点R的x坐标。 3. 数字签名验证 数字签名验证也可以分为四步: (1)计算消息的摘要值。使用SHA-256算法计算出消息的摘要值,摘要值的长度为256位。 (2)计算椭圆曲线上的点。根据签名中的点R和数字签名S计算出椭圆曲线上的点V,其中V = [h]P + [s]Q,h为摘要值的哈希值,P为公钥,Q为点R。 (3)验证数字签名。如果V的x坐标等于R的x坐标,则认为数字签名有效,否则认为数字签名无效。 (4)安全性检查。如果验证通过,还需要进行安全性检查,检查签名是否被篡改或重放攻击。 基于国密SM2数字签名技术具有高强度、高安全性、高效率等优点,广泛应用于电子商务、金融支付、政府机构等领域。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值