基于新唐M0的XXTEA加密解密算法源码

[复制链接]
1672|3
 楼主| monkeypony 发表于 2014-3-29 18:10 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------
  2.     在数据的加解密领域,算法分为对称密钥与非对称密钥两种。对称密钥与非对称密钥由于各自的特点,所应用的领域是不尽相
  3. 同的。对称密钥加密算法由于其速度快,一般用于整体数据的加密,而非对称密钥加密算法的安全性能佳,在数字签名领域得到广
  4. 泛的应用。
  5.     TEA算法是由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明,TEA是Tiny Encryption Algorithm的缩写,
  6. 以加密解密速度快,实现简单著称。TEA算法每一次可以操作64bit(8byte),采用128bit(16byte)作为key,算法采用迭代的形式,
  7. 推荐的迭代轮数是64轮,最少32轮。为解决TEA算法密钥表攻击的问题,TEA算法先后经历了几次改进,从XTEA到BLOCK TEA,直至
  8. 最新的XXTEA。XTEA也称做TEAN,它使用与TEA相同的简单运算,但四个子密钥采取不正规的方式进行混合以阻止密钥表攻击。
  9.     Block TEA算法可以对32位的任意整数倍长度的变量块进行加解密的操作,该算法将XTEA轮循函数依次应用于块中的每个字,并且
  10. 将它附加于被应用字的邻字。XXTEA使用跟Block TEA相似的结构,但在处理块中每个字时利用了相邻字,且用拥有两个输入量的
  11. MX函数代替了XTEA轮循函数。本文所描述的安全机制采用的加密算法就是TEA算法中安全性能最佳的改进版本-XXTEA算法。
  12.     XXTEA算法的结构非常简单,只需要执行加法、异或和寄存的硬件即可,且软件实现的代码非常短小,具有可移植性,非常适合
  13. 嵌入式系统应用。由于XXTEA算法的以上优点,可以很好地应用于嵌入式RFID系统当中。
  14. ---------------------------------------------------------------------------------------------------------*/
  15. #include <string.h>
  16. #include <stdio.h>

  17. #define MX (z>>5^y<<2) + (y>>3^z<<4)^(sum^y) + (k[p&3^e]^z)

  18. //注意:delta的取值是随机的,但是为了避免不良的取值,采取的是
  19. //黄金分割数(根号5-2)/2与2的32次方的乘积。为0x9e3779b9。   
  20. //在解密中,sum=delta×round,如:delta×32=13C6EF3720
  21.    
  22. //v表示为运算的长整型数据的首地址
  23. //k为长整型的密钥的首地址
  24. //n表示以32bit为基本单位的要运算的组元个数,正表示加密,负表示解密

  25. long xxtea(long* v, long n, long* k);

  26. long xxtea(long* v, long n, long* k)
  27. {
  28.     unsigned long z=v[n-1], y=v[0], sum=0, e, DELTA=0x9e3779b9;
  29.     long p, q;
  30.    
  31.     if(n > 1)
  32.     {/* 加密过程 */
  33.         q = 6 + 52/n;
  34.         while(q-- > 0)
  35.         {
  36.             sum += DELTA; e = (sum >> 2) & 3;
  37.             for (p=0; p<n-1; p++) y = v[p+1], z = v[p] += MX;
  38.             y = v[0]; z = v[n-1] += MX;
  39.         }
  40.         return 0;
  41.     }
  42.     else
  43.     if(n < -1)
  44.     {/* 解密过程 */
  45.         n = -n; q = 6 + 52/n; sum = q*DELTA;
  46.         while(sum != 0)
  47.         {
  48.             e = (sum >> 2) & 3;
  49.             for (p=n-1; p>0; p--) z = v[p-1], y = v[p] -= MX;
  50.             z = v[n-1]; y = v[0] -= MX; sum -= DELTA;
  51.         }
  52.         return 0;
  53.     }  
  54.     return 1;
  55. }

  56. void  xxtea_test(void)
  57. {
  58.     unsigned long buff[4];
  59.     unsigned long test[4]={0x11223344,0x55667788,0x99AABBCC,0xDDEEFF00};
  60.     unsigned long keys[4]={0x12345678,0x9ABCDEF0,0x12345678,0x9ABCDEF0};
  61.    
  62.     while(1)
  63.     {
  64.         printf("\n\rxxtea test: \n\r");
  65.         memcpy(buff,test,16); printf("0x%08x,0x%08x,0x%08x,0x%08x\n\r",buff[0],buff[1],buff[2],buff[3]);
  66.         xxtea( buff, 4,keys); printf("0x%08x,0x%08x,0x%08x,0x%08x\n\r",buff[0],buff[1],buff[2],buff[3]);
  67.         xxtea( buff,-4,keys); printf("0x%08x,0x%08x,0x%08x,0x%08x\n\r",buff[0],buff[1],buff[2],buff[3]);
  68.         
  69.         while(1);
  70.     }
  71. }


long009 发表于 2014-3-29 18:26 | 显示全部楼层
:lol看看
kfliuyan 发表于 2014-3-29 19:54 来自手机 | 显示全部楼层
学习下
kfliuyan 发表于 2014-3-29 19:54 来自手机 | 显示全部楼层
学习下加密
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

715

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部