datasheet
超过460,000+ 应用技术资源下载
rar

3DES、AES、RC6、TEA、RSA、MD5、SHA1、SHA256加密源码大聚齐

  • 1星
  • 日期: 2013-08-22
  • 大小: 406.05KB
  • 所需积分:1分
  • 下载次数:78
  • favicon收藏
  • rep举报
  • 分享
  • free评论
标签: 3DESAESRC6TEARSAMD5SHA1SHA256

原作者:win2kddk 前两天想帮朋友做一个ARM/STM32的ISP脱机下载器,想到固件平时是保存在外部SPI ROM里的需要加密。这两天在网上研究了一下流行的文件加密方法并调试和整理了一下,特此公布。先简单的扫扫盲,大家可以边看边下载呵。

 

DES---研究过加密的朋友十分熟悉,老牌的加密方法了。这是一个可逆的对称加密算法,也是应用最广泛的密钥系统。好像是从1977年美国政府开始采用的。大家都看过U-571吧,DES的思路就是参照二战时期盟军缴获的德军恩格玛加密机,不过DES比那个要NB的多多了。到现在为止,除了差分分析法和线性分析法外只有暴力穷举法了。前两种方法不是密码学家或数学家都不懂呵,不过穷举DES,以现有我们大家都可以掌握的技术手段,恐怕没个几百上千年下不来呵。不过,咱们破解不了,不能说明就没人或没有设备破解不了。正因为如此,所以才衍生出了3重DES加密。常规的DES密钥是64位的(实际上有8位是校验用),而3DES是128位(当然有16位也是校验用)。增加密钥长度并增加运算量来防止破解,并在后来的AES出来之前确定为过度方案。不过现在即便有了AES,3DES也没少用,它依然很NB。

 下载DES.RAR

 

AES---它是一种高级加密标准,也叫Rijndael算法,2002年成为标准。它是用来代替原来的DES加密方法的。它也是一个可逆的对称加密算法。研究过IAP的朋友应该明白,把做好的固件程序通过AES加密后发布,用户可以通过IAP的方式来在线升级程序,而开发者则不必担心自己的生产代码流失。即能加密又能还原,这就是可逆加密算法,这也是我们想用到的。AES在早期的方案征集时就规定了要软硬件可以很好的集成,所以它也比较小,程序量比DES要少一些。

 下载AES.RAR

 

RC6---有个算法RC4听说过吧,在无线传输和串行流传输的加密领域占有相当的分量。据说RC6是同一帮人研究出来的,不过它和RC4没太大关系呵。它是AES方案征集时的候选算法之一,但是没有Rijndael算法那么幸运。RC6据说可以抵抗所有已知的攻击,并能够提供AES所要求的安全性,它也是相当优秀的一种可逆加密算法。不过当初它为什么没能当选为AES算法就不得而知了,不知道当时有没有给评委们足够的商务费用呵。

 下载RC6.RAR

 

TEA---它是一种分组加密算法,也是可逆算法。短小精悍。它的实现非常简单,超不过10行代码。TEA算法每一次可以操作64位(8字节),采用128位(16字节)作为密钥,算法采用迭代的形式,尽管32轮迭代已经足够了,但是最好的迭代轮数是64轮。数据流加密可能比较适合,因为据说早期的QQ采用过TEA加密算法。

 下载TEA.RAR

 

RSA---顶顶有名的非对称公钥加密算法,也许你可能不熟悉,不过网银总应该用过吧,多数都是RSA算法来认证的。1977年就开发出来了,DES时代的东东了。不过用到现在依然坚挺,可见加密强度有多高。呵呵,不过它防解密的原理也很简单:只告诉你两个数相乘后的结果,你能知道原来的两个数是什么吗?RSA的安全性依赖于大数的因子分解,但是并没有理论上可以证明破译RSA的难度与大数分解难度是同样的。它是第一个既能用于数据加密也能用于数字签名的算法,也是可逆算法。不过,在不告诉你密钥的情况下,你就是想什么办法加密后的数据也还原不回去,银行系统用它自有道理呵。告诉你个小秘密,前面说过的RC6好像就是有RSA开发组成员参与搞出来的。不过,RSA也有不少缺点。它受到素数产生技术的限制,产生密钥时很麻烦;出于安全性考虑,分组长度至少也要600位以上,运算代价很高、速度比较慢,比DES之类的对称算法要慢的多。它最大的缺点是需要生成大素数及大数取模时可能会产生特别大的数据量,这些都很耗费时间,生成复杂密钥时在单片机上运行可能都不止10分钟,所以解密时还是尽量让PC或服务器来做吧。

 下载RSA.RAR

 

MD5---非常著名的哈希算法,不可逆算法。网站登录、操作系统的用户认证、文件完整性和数字签名等领域广泛应用。不可逆算法一般做的都比较绝,例如彩虹加密狗,只告诉你一个余数,你能知道原来的除数和被除数吗?只把运算过的数据相比较,而不非得知道原数据,这样就完成了认证过程。要想破解MD5的密码,即使采用现在最快的巨型计算机,据说也要运算100万年以上。不过,加密和解密都是数学领域的竞赛,每一种加密算法都或多或少的存在漏洞或缺陷,MD5看上去真那么牢不可破吗?和MD5同样有名的是山东大学的王小云教授。在2004年的国际密码大会上王小云宣布了她的研究小组完成了对MD5杂凑函数的杂凑冲撞,也就是从理论上说使用MD5的数字签名可以伪造。这也意味着MD5可能需要和其他加密算法共用才可以保证数字签名的安全。不过,说MD5已被破解,那也有些杞人忧天了。可以肯定的告诉你,网络上所有针对MD5提供的破解服务,全部都是查询用字典法暴力破解后的数据包,没有一个是真正伪造出来的数字签名,那些号称有几百亿条的记录对MD5庞大算法来说太小了。试想想,动用美国军方的巨型计算机,利用王小云研究理论,来破解我们的一个单片机或网站认证程序?没必要吧。所以MD5依然可用呵,只不过再加上3DES、AES或SHA来防止字典就更好了。

 下载MD5.RAR

 

SHA---著名的哈希算法,不可逆算法。也是多用在数字签名上。SHA-1和MD5一样,也被王小云教授找出杂凑冲撞的漏洞,不过也是停留在理论上的。SHA-256是很NB的,它光密钥就有64个long,恐怕想要破解已经是天文数字了。最NB的是SHA-512,咱们这里没有收录,这里恐怕还没有人能用得上。

 下载SHA-1.RAR

 下载SHA-256.RAR

 

好了,先介绍到这里,一字一字的打真不容易呵。以上所有的程序均为C源程序,不用其他文件,里面都附带了测试程序,在KEIL 4.21上跑过仿真,放心使用。程序大多不是我自己编的,有C++的源程改的,也有别人的C源程。为了尊重别人的劳动成果,里面会带有人家的名字。我只是做了整理和调试。

 例如TEA的测试程序:

 void TEA_Test(void)

 {

      unsigned char dat[16]=\"0123456789ABCDEF\";

      unsigned char TEA_key[16];

      memcpy(TEA_key,\"0123456789abcdef\",16);//做运算之前先要设置好密钥,这里只是设置密钥的DEMO。

 

      TEA_Encrypt(dat,TEA_key);    //TEA加密,数组dat里面的新内容就是加密后的数据。

      TEA_Decrpyt(dat,TEA_key);    //密文数据存放在dat里面,经TEA解密就能得到之前的明文。

 }

 

DES的测试程序:

 void DES3_Test(void)

 {

      unsigned char in_buf[8] = \"ABCDEFGH\";

      unsigned char miwen[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

      unsigned char out_buf[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

 

      memcpy(DES_key,\"0123456789abcdef\",16);//3DES的密钥是128位的,这里只是设置密钥的DEMO。

      

      DEC3_Encrypt(in_buf,miwen);    //3DES加密

      DEC3_Decrypt(miwen,out_buf);  //3DES解密

 }

 

不用管其他程序是怎么完成的,会用C语言的都能看懂吧。有兴趣和有时间可以研究一下运算程序,深入了解一下加密方法。

 

测试方法与过程:

 DES算法和AES算法都有现成的加密软件,把软仿真计算过的数据和人家的软件做对比,并能解密还原为原数据。

 RC6、TEA、SHA-256暂时没有找到测试软件,通过不同的密钥看到加密后的数据被完全打散或变形,并能还原为原数据(SHA-256除外)。

 RSA也没找到测试软件相对比。实际测试不太复杂的数据加解密数据正常,太复杂的数据用软仿真半小时后解密未果。

 MD5和SHA-1算法也有现成的加密软件,自已计算的数据和人家算过的数据做对比,数据准确。

更多简介内容

评论


个人中心

意见反馈

求资源

回顶部

下载专区


TI 参考设计资源库

工业电子 汽车电子 个人电子
$(function(){ var appid = $(".select li a").data("channel"); $(".select li a").click(function(){ var appid = $(this).data("channel"); $('.select dt').html($(this).html()); $('#channel').val(appid); }) })