国密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算法。

0 0