简单的消息摘要算法c语言,国密算法的一些简单学习

本文详细介绍了国密算法中的SM2数字签名算法,包括签名的生成和验证过程。SM2是基于椭圆曲线密码学(ECC)的非对称加密算法,用于保障数据的安全。文中通过代码示例展示了如何使用随机数生成、椭圆曲线运算等步骤来实现签名和验证。此外,还提到了相关参数的预处理和杂凑值的计算,以及使用libtommath库进行大数运算。
摘要由CSDN通过智能技术生成

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)。

a2426fdbfc8a

屏幕快照 2018-12-20 下午2.22.59.png

数字签名的验证算法:

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′是否成立,若成立则验证通过;否则验证不通过。

a2426fdbfc8a

屏幕快照 2018-12-20 下午2.25.42.png

接下来就是对于给的测试数据进行代码分析(本文所用代码是从Github大佬下载的,然后学习的,本着学习的精神来的,如果有合适的,请大佬赐教)

Fp 上的椭圆曲线数字签名

椭圆曲线方程为:y2 = x3 + ax + b

Fp -256 下面是一些参数:直接上图。

a2426fdbfc8a

屏幕快照 2018-12-20 下午2.29.55.png

下面是参数输入

a2426fdbfc8a

屏幕快照 2018-12-20 下午2.32.41.png

预处理 (ENTLA )

a2426fdbfc8a

屏幕快照 2018-12-20 下午2.34.57.png

杂凑值ZA=H256(ENTLA ∥IDA ∥a∥b∥xG ∥yG ∥xA ∥yA)。

a2426fdbfc8a

屏幕快照 2018-12-20 下午2.36.50.png

a2426fdbfc8a

屏幕快照 2018-12-20 下午2.39.13.png

得到摘要

a2426fdbfc8a

屏幕快照 2018-12-20 下午2.39.42.png

获取随机值K

a2426fdbfc8a

屏幕快照 2018-12-20 下午2.41.23.png

a2426fdbfc8a

屏幕快照 2018-12-20 下午2.42.30.png

a2426fdbfc8a

屏幕快照 2018-12-20 下午2.42.30.png

a2426fdbfc8a

屏幕快照 2018-12-20 下午2.43.41.png

a2426fdbfc8a

屏幕快照 2018-12-20 下午2.43.53.png

基于libtommath函数的实现

libtommath是一个大数算法库.这个C语言的函数库非常牛X可以实现多种算法。感兴趣的可以去学习https://github.com/libtom/libtommath。

可以验证算法文档给出的实例。

代码项目作者simonpang/steven.psm@gmail.com;感谢libtommath作者及goldbar :)

站在大佬的肩膀上学习真香。鸣谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值