1:国密算法是什么?
国密算法是我国自主研发创新的一套数据加密处理系列算法。从SM1-SM4分别实现了对称、非对称、摘要等算法功能。
SM1 为对称加密;
SM2为非对称加密,基于ECC;
SM3 消息摘要;
SM4 对称加密;
2:SM2的学习-数字签名
先了解几个东西
ECC: 椭圆曲线算法。
数字签名:由一个签名者对数据产生数字签名,并由一个验证者验证签名的可靠性。每个签名 者有一个公钥和一个私钥,其中私钥用于产生签名,验证者用签名者的公钥验证签名。在签名的生成 过程之前,要用密码杂凑函数对M (包含ZA和待签消息M)进行压缩;在验证过程之前,要用密码杂 凑函数对M′(包含ZA和验证消息M′)进行压缩。
详细可参考《国密算法SM2椭圆曲线公钥密码算法》
下面来看一下数字签名的过程:
准备工作:计算用户的ZA值(椭圆曲线方程参数a、b、G的 坐标xG、yG 和PA的坐标xA、yA的数据类型转换为比特串,ZA=H256(ENTLA ∥ IDA ∥ a ∥ b ∥ xG ∥ yG ∥xA ∥yA)。)
A1:置M=ZA ∥ M;
A2:计算e = Hv(M),国密算法第1部分4.2.3和4.2.2给出的细节将e的数据类型转换为整数;
A3:用随机数发生器产生随机数k ∈[1,n-1];
A4:计算椭圆曲线点(x1,y1)=[k]G,国密算法第1部分4.2.7给出的细节将x1的数据类型转换为整
数;
A5:计算r=(e+x1) modn,若r=0或r+k=n则返回A3;
A6:计算s = ((1 + dA)−1 · (k − r · dA)) modn,若s=0则返回A3;
A7:按本文本第1部分4.2.1给出的细节将r、s的数据类型转换为字节串,消息M 的签名为(r,s)。
数字签名的验证算法:
B1:检验r′ ∈[1,n-1]是否成立,若不成立则验证不通过;
B2:检验s′ ∈[1,n-1]是否成立,若不成立则验证不通过;
B3:置M′=ZA ∥ M′;
B4:计算e′ = Hv(M′),国密算法文档第1部分4.2.3和4.2.2给出的细节将e′的数据类型转换为整数;
B5:按本文本第1部分4.2.2给出的细节将r′、s′的数据类型转换为整数,计算t = (r′ + s′) modn, 若t = 0,则验证不通过;
B6:计算椭圆曲线点(x′1, y1′ )=[s′]G + [t]PA;
B7:按本文本第1部分4.2.7给出的细节将x′1的数据类型转换为整数,计算R = (e′ + x′1) modn,检 验R=r′是否成立,若成立则验证通过;否则验证不通过。
接下来就是对于给的测试数据进行代码分析(本文所用代码是从Github大佬下载的,然后学习的,本着学习的精神来的,如果有合适的,请大佬赐教)
Fp 上的椭圆曲线数字签名
椭圆曲线方程为:y2 = x3 + ax + b
Fp -256 下面是一些参数:直接上图。
下面是参数输入
预处理 (ENTLA )
杂凑值ZA=H256(ENTLA ∥IDA ∥a∥b∥xG ∥yG ∥xA ∥yA)。
得到摘要
获取随机值K
基于libtommath函数的实现
libtommath是一个大数算法库.这个C语言的函数库非常牛X可以实现多种算法。感兴趣的可以去学习https://github.com/libtom/libtommath。
可以验证算法文档给出的实例。
代码项目作者simonpang/steven.psm@gmail.com;感谢libtommath作者及goldbar :)
站在大佬的肩膀上学习真香。鸣谢。