分类: 网络与安全
2013-01-05 10:53:39
国密办已于去年公布国产商密算法SM3,,这给其应用和开发带来了方便,也见网上有许多实现的例子,出于一个项目开发需要,也试试其实现。
实现思路:完全从头来写不太适合如今开发时代,尤其是开源代码的大量使用。密码算法实现比较有名的就是: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);
程序运行结果与标准文档的测试数据比较完全一致,证明实现正确。
为了便于大家学习请到 下载,使用VC6开发,全部工程代码,并附带有SM3-HMAC算法。