目录
ZA=SM3(ENTLA ‖ IDA ‖ a ‖ b ‖ xG ‖ yG ‖ xA ‖ yA)
s = (1 + dA)^(-1) * (k - r * dA) mod n
① ZA=SM3(ENTLA ‖ IDA ‖ a ‖ b ‖ xG ‖ yG ‖ xA ‖ yA)
⑤s = (1 + dA)^(-1) * (k - r * dA) mod n
1、可能得考点
涉及SM2签名的考点,可能有几个点,ZA、随机数K、私钥d,下面对这几个值进行一下验算
2、签名预处理
下面是签名的流程图,ZA也叫预处理1值,e也叫预处理2值,签名过程的哈希算法都是SM3,计算ZA、e值,有助于理解SM2签名验签
ZA=SM3(ENTLA ‖ IDA ‖ a ‖ b ‖ xG ‖ yG ‖ xA ‖ yA)
参数n
FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123
参数P
FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
参数a
FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
参数b
28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
参数G
32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7
BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0
IDA一般默认是31323334353637383132333435363738
ENTLA指的是IDA的长度0080
xA , yA 为公钥值
e=SM3(ZA || M)
3、签名值RS
r=e+X1 mod n
s = (1 + dA)^(-1) * (k - r * dA) mod n
根据s的公式,推导出(变换公式)
K=(1+d)s+r*d mod n
dA=(k-s)(s+r)^(-1) mod n
可以看出,可以通过r、s、d求出随机数k
也可以通过r、s、k求出私钥d;
签名攻击
经常做签名攻击验证的,都知道是为了验证是否能求出私钥d,和随机数K
签名攻击是什么情况呢,使用一个私钥对两组数据进行签名,验证随机数是否重复
是已知一个私钥、两组签名值(r1,s1),(r2,s2),k重复使用,求K、da
s1 = (1 + da)^(-1)(k - r1*da) mod n
s2 = (1 + da)^(-1)(k - r2*da) mod n
如果K相同,由上面两个式子推导出da=(r2-r1)/[(r2-r1)-(S1-S2)]-1,求出da
K=(1+d)s+r*d mod n,求出K
怎么推导da的,把mod n去掉,二元一次方程组变换就行
4、验证过程
举个例子
已知私钥
34D3A275665714D891B591927813D5D8BD911865DB79C630A0BA324BC285B4A1
公钥
A3A1C53963EF116A7A9AE7DDCF449BEA8CDA574282317D7E8D9202807A8D3DEA439E688091BF448625A422304CF92C4C8AA353C11EF38FBA800AA8FDF830418D
消息
123456
随机数K
0D5CE916C79C6738E2DD82E76429107A4BFDA88E5CCA306A649A0F9BF04B3C09
问题1,求e、r、s值
问题2,通过r、s、d求出随机数k
问题3,通过r、s、k求出私钥d
① ZA=SM3(ENTLA ‖ IDA ‖ a ‖ b ‖ xG ‖ yG ‖ xA ‖ yA)
f0b47be3bc3c03cc54414c57961a56973ba1454c1eeb6e7209d6c5ad314977d0
② e=SM3(ZA || M)
13910ac59ca36bd57d82d4c0aae6fd4923f827d4bb8e7629b8f2093deb648f82
③(x1,y1)=[k]G
X1=fd9889fe095654663624a6fb5adf127c59203ba5eafab708bd2499dc0d87373b
④ r=e+X1 mod n
112994C4A5F9C03BB3A77BBC05C60FC60B14840F84C32807225AAF10BF16859A
⑤s = (1 + dA)^(-1) * (k - r * dA) mod n
先算(1 + dA)^(-1) mod n
DBF01FC1C85AD5999096B1D800F379DA2D34376348E142DC9A8A304B1B4D65FC
再算r*d mod n
5088A35A0A45CD1F98DD19E889C67504614BE49CA2CDACDB84065AC77E0749B4
算k-r*d mod n
BCD445BBBD569A194A0068FEDA629B755CB5A35CDBC288BA344FA8DDAC193378
最后s=(1 + dA)^(-1) (k-r*d )mod n
BBB2C09FB0C149FF863193631F76B8D856BF420C57E359288D1DB266E24C130F
签名值rs,使用工具验证一下
112994C4A5F9C03BB3A77BBC05C60FC60B14840F84C32807225AAF10BF16859A
BBB2C09FB0C149FF863193631F76B8D856BF420C57E359288D1DB266E24C130F
⑥通过r、s、d求出随机数k
按照之前计算方法
(1+d ) *s mod n
BCD445BBBD569A194A0068FEDA629B755CB5A35CDBC288BA344FA8DDAC193378
r*d mod n
5088A35A0A45CD1F98DD19E889C67504614BE49CA2CDACDB84065AC77E0749B4
K=(1+d)s+r*d mod n,验证正确
⑦通过r、s、k求出私钥d
k-s mod n
51AA287616DB1D395CABEF8444B257A1674245ED26ACDC6D2B38513E47D46A1D
(s+r)^-1
F3F990BF9CACCCF8AF77E32A51C702DCBCE23A8EB28C62CB70078D000C25C1AB
dA=(k-s)(s+r)^(-1) mod n,验证正确;所以这个随机数K是非常重要的,对K进行保护严禁泄露,等同于保护私钥