国密SM3杂凑算法与实现
来源:互联网 发布:mate7电信没有4g 网络 编辑:程序博客网 时间:2024/05/02 01:16
国密办已于去年公布国产商密算法SM3,http://www.oscca.gov.cn/News/201012/News_1199.htm,这给其应用和开发带来了方便,也见网上有许多实现的例子,出于一个项目开发需要,也试试其实现。
实现思路:完全从头来写不太适合如今开发时代,尤其是开源代码的大量使用。密码算法实现比较有名的就是:openssl,其体系庞大,使用也方便。但从学习与研究上来看,还是需要实现一个简化的代码,要小,适用于移植与嵌入。那就看看有没有更简洁的源代码库。在网上搜索一下,还找到个比较好的算法库,也不大,就是:Xyssl,好像是个法国人开发,管他是谁好用就行。
Xyssl实现了常用杂凑算法MD2,MD4,MD5,SHA1,SHA2,SHA4等,并且代码简洁,适用于扩展,了解其实现机制外,那就看看我们的SM3算法吧。
SM3算法结果为256位,其大体上与SHA256相同,其算法过程如下:
1、填充
SM3对消息长度小于为2^64位进行运算,其填充方法与SHA256的相同,假设消息m 的长度为l 比特。首先将比特“1”添加到消息的末尾,再添加k 个“0”,k是满足l + 1 + k = 448mod512 的最小的非负整数。然后再添加一个64位比特串,该比特串是长度l的二进制表示。填充后的消息m′ 的比特长度为512的倍数。
2、迭代压缩
这个过程与其他HASH算法类似,先进行消息扩展,之后迭代与压缩,其详细过程可参考标准文档。其扩展与压缩计算以循环移位为主,并有异或计算。
在算法开发中碰到一个很有趣的事:使用VC6进行开发,在消息扩展使用,计算式比较长:
W[j] = P1( W[j-16] ^ W[j-9] ^ ROTL(W[j-3],15)) ^ ROTL(W[j - 13],7 ) ^ W[j-6];
其运行结果为:VC6的debug版运行与标准说明的相同,而release版结果不同,变化很大,据分析可能原因是:VC6的编译优化上可能有些不够造成的,而用VC++2008 就不会出现debug和release计算结果不同的现象。
后来将这复杂算式改为多步计算,问题就没了,哈哈,管他呢,解决问题是硬道理啊。
填充的消息经扩展后在进行64轮迭代,最后就算出杂凑结果。
SS1 = ROTL((ROTL(A,12) + E + ROTL(T[j],j)), 7);
SS2 = SS1 ^ ROTL(A,12);
TT1 = FF0(A,B,C) + D + SS2 + W1[j];
TT2 = GG0(E,F,G) + H + SS1 + W[j];
D = C;
C = ROTL(B,9);
B = A;
A = TT1;
H = G;
G = ROTL(F,19);
F = E;
E = P0(TT2);
程序运行结果与标准文档的测试数据比较完全一致,证明实现正确。
为了便于大家学习请到 http://download.csdn.net/detail/goldboar/3751538 下载,使用VC6开发,全部工程代码,并附带有SM3-HMAC算法。
- 国密SM3杂凑算法与实现
- 国密SM3杂凑算法与实现
- 国密SM3杂凑算法与实现
- 国密杂凑算法SM3
- 国密杂凑算法SM3
- SM3通过证书杂凑
- SM3算法
- sm3算法
- MD5杂凑算法
- 用openssl实现sm2算法文档中示例,包含sm3
- 杂凑法存取的算法
- 安全杂凑算法(SHA)
- iOS-嵌入SM3算法
- 国密SM1、SM2、SM3、SM4算法资料大全
- 杂凑密码——摘要算法简介
- 国密算法(SM2,SM3,SM4)完善与算法辅助工具开发
- 国密算法(SM2,SM3,SM4)完善与算法辅助工具开发
- 国密SM1\ SM2\ SM3\ SM4\ SSF33算法和国际RSA算法的对应关系
- [hdu 5032]2014北京网络赛Always Cook Mushroom 离线线段树/树状数组
- JFreeChart 实现各种数据统计图(柱形图,饼状图,折线图)
- android frameworks的按钮监听
- hadoop节点故障解决一例
- android坐标
- 国密SM3杂凑算法与实现
- CoreData线程安全
- 数据库索引详解
- rpm 命令
- struts2中<s:if>标签中判断session值
- DES 加密后转16进制输出
- UML 用例建模分析
- 国密SM4对称算法实现说明(原SMS4无线局域网算法标准)
- 不出100年,地球你将认不出(科技闹的)