Chinaunix首页 | 论坛 | 博客
  • 博客访问: 285883
  • 博文数量: 38
  • 博客积分: 706
  • 博客等级: 上士
  • 技术积分: 390
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-05 09:09
文章分类

全部博文(38)

文章存档

2013年(23)

2012年(15)

我的朋友

分类: 网络与安全

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

阅读(33579) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~