C++ XXTEA分组加密解密算法

来源:互联网 发布:vs2013写c语言 编辑:程序博客网 时间:2024/06/06 07:14

微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA)都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。

        TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9 )。


下面是作者给出的该算法的C实现:

  1. #define MX (z>>5^y<<2) + (y>>3^z<<4)^(sum^y) + (k[p&3^e]^z);  
  2.   
  3. long btea(long* v, long n, long* k) {  
  4.     unsigned long z=v[n-1], y=v[0], sum=0, e, DELTA=0x9e3779b9;  
  5.     long p, q ;  
  6.     if (n > 1) {          /* Coding Part */  
  7.         q = 6 + 52/n;  
  8.         while (q-- > 0) {  
  9.             sum += DELTA;  
  10.             e = (sum >> 2) & 3;  
  11.             for (p=0; p<n-1; p++) y = v[p+1], z = v[p] += MX;  
  12.             y = v[0];  
  13.             z = v[n-1] += MX;  
  14.         }  
  15.         return 0 ;   
  16.     } else if (n < -1) {  /* Decoding Part */  
  17.         n = -n;  
  18.         q = 6 + 52/n;  
  19.         sum = q*DELTA ;  
  20.         while (sum != 0) {  
  21.             e = (sum >> 2) & 3;  
  22.             for (p=n-1; p>0; p--) z = v[p-1], y = v[p] -= MX;  
  23.             z = v[n-1];  
  24.             y = v[0] -= MX;  
  25.             sum -= DELTA;  
  26.         }  
  27.         return 0;  
  28.     }  
  29.     return 1;  
  30. }  

下面给出的是测试代码:

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.   
  5. #define MX (z>>5^y<<2) + (y>>3^z<<4)^(sum^y) + (k[p&3^e]^z);  
  6.   
  7. long btea(long* v, long n, long* k) {  
  8.     unsigned long z=v[n-1], y=v[0], sum=0, e, DELTA=0x9e3779b9;  
  9.     long p, q ;  
  10.     if (n > 1) {          /* Coding Part */  
  11.         q = 6 + 52/n;  
  12.         while (q-- > 0) {  
  13.             sum += DELTA;  
  14.             e = (sum >> 2) & 3;  
  15.             for (p=0; p<n-1; p++) y = v[p+1], z = v[p] += MX;  
  16.             y = v[0];  
  17.             z = v[n-1] += MX;  
  18.         }  
  19.         return 0 ;   
  20.     } else if (n < -1) {  /* Decoding Part */  
  21.         n = -n;  
  22.         q = 6 + 52/n;  
  23.         sum = q*DELTA ;  
  24.         while (sum != 0) {  
  25.             e = (sum >> 2) & 3;  
  26.             for (p=n-1; p>0; p--) z = v[p-1], y = v[p] -= MX;  
  27.             z = v[n-1];  
  28.             y = v[0] -= MX;  
  29.             sum -= DELTA;  
  30.         }  
  31.         return 0;  
  32.     }  
  33.     return 1;  
  34. }  
  35.   
  36. void main() {  
  37.     long n = 10;  
  38.     long k[4] = {1,2,3,4};  
  39.     char data[1024] = "" ;  
  40.   
  41.     int datalen = 0;  
  42.     char szdata[2048];  
  43.     int i = 0;  
  44.   
  45.     // 控制台输入需要加密的串  
  46.     printf( "Do Encrypt. Input Data: " ) ;  
  47.     scanf( "%s", data) ;  
  48.     printf( "Data:\n %s\n", data ) ;  
  49.   
  50.     btea((long*)data, n, k);   // n为10,表示加密  <1>  
  51.   
  52.     printf( "Encrypt Data:\n %s\n", data);   
  53.   
  54.     // 转换成十六进制格式.  
  55.     datalen = strlen(data);  
  56.     for(i = 0; i < datalen; ++i)  
  57.         sprintf(&szdata[2*i], "%02X", (unsigned char)data[i]);  
  58.     szdata[2 * i] = 0;     
  59.     printf("Hex data: %s\n", szdata);  
  60.   
  61.     //转换回来  
  62.     datalen = strlen(szdata);  
  63.     for(i = 0; i < datalen / 2; ++i)  
  64.         sscanf(&data[i], "%02X", &szdata[2 * i]);  
  65.     data[i] = 0;  
  66.     printf("Bin data: \n %s\n", data);  
  67.   
  68.   
  69.     btea((long*)data, -n, k);   // n为-10,表示解密  
  70.   
  71.     printf( "Decrypt Data:\n %s\n", data);  
  72.     system("pause");  
  73. }