• [转]国密SM3杂凑算法与实现


    国密办已于去年公布国产商密算法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算法。

  • 相关阅读:
    2016年个人终结
    从一个程序员的角度看——微信小应用
    Spring 注解
    spring 大纲
    hibernate提纲
    spring基础
    eclipse如何利用userLibrary更好的分类jar
    【tomcat】There are no resources that can be added or removed from the server
    spring mvc 学习历程
    帝国CMS列表模板页面IF判断
  • 原文地址:https://www.cnblogs.com/adylee/p/2878300.html
Copyright © 2020-2023  润新知