赞
踩
最近上课的时候刚好研究到了SM2,所以顺便在CSDN上混更一下~
SM系列是我国的国产密码算法,其中SM1、SM7、SM9算法暂未公开,目前公开的算法主要为SM2(中国的ECC)、SM3(中国的SHA-256)、SM4(中国的AES)。
国密算法的基础及其与国际商密算法的对应关系如下图所示。
今天我们要讲的就是SM2中的数字签名算法。
SM2算法基于椭圆曲线公钥算法,和ECC是一样的,不过国密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
n−1 之间的随机数
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⋅(k−r⋅dA))(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⋅(k−r⋅dA)=((1+dA)−1⋅(k+k⋅dA)=k(mod n)
于是用户A的私钥完全不起作用,数字签名也就失去了它本来的意义。
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
n−1 之间的数,如果不成立,则验证不通过。
原理:签名流程中
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⋅(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=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′)=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'=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
s′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
R
R 和
r
′
r'
r′ 应该要相等,否则总会有一个环节出问题。
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的非对称加密算法之一。
本期内容就到这里了,我们下期再见~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。