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

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

 

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

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

long btea(long* v, long n, long* k) {
unsigned long z=v[n-1], y=v[0], sum=0, e, DELTA=0x9e3779b9;
long p, q ;
if (n > 1) { /* Coding Part */
q = 6 + 52/n;
while (q-- > 0) {
sum += DELTA;
e = (sum >> 2) & 3;
for (p=0; p<n-1; p++) y = v[p+1], z = v[p] += MX;
y = v[0];
z = v[n-1] += MX;
}
return 0 ;
} else if (n < -1) { /* Decoding Part */
n = -n;
q = 6 + 52/n;
sum = q*DELTA ;
while (sum != 0) {
e = (sum >> 2) & 3;
for (p=n-1; p>0; p--) z = v[p-1], y = v[p] -= MX;
z = v[n-1];
y = v[0] -= MX;
sum -= DELTA;
}
return 0;
}
return 1;
}

下面给出的是测试代码:

#include <stdio.h>  
#include <stdlib.h>
#include <string.h>

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

long btea(long* v, long n, long* k) {
unsigned long z=v[n-1], y=v[0], sum=0, e, DELTA=0x9e3779b9;
long p, q ;
if (n > 1) { /* Coding Part */
q = 6 + 52/n;
while (q-- > 0) {
sum += DELTA;
e = (sum >> 2) & 3;
for (p=0; p<n-1; p++) y = v[p+1], z = v[p] += MX;
y = v[0];
z = v[n-1] += MX;
}
return 0 ;
} else if (n < -1) { /* Decoding Part */
n = -n;
q = 6 + 52/n;
sum = q*DELTA ;
while (sum != 0) {
e = (sum >> 2) & 3;
for (p=n-1; p>0; p--) z = v[p-1], y = v[p] -= MX;
z = v[n-1];
y = v[0] -= MX;
sum -= DELTA;
}
return 0;
}
return 1;
}

void main() {
long n = 10;
long k[4] = {1,2,3,4};
char data[1024] = "" ;

int datalen = 0;
char szdata[2048];
int i = 0;

// 控制台输入需要加密的串
printf( "Do Encrypt. Input Data: " ) ;
scanf( "%s", data) ;
printf( "Data:\n %s\n", data ) ;

btea((long*)data, n, k); // n为10,表示加密 <1>

printf( "Encrypt Data:\n %s\n", data);

// 转换成十六进制格式.
datalen = strlen(data);
for(i = 0; i < datalen; ++i)
sprintf(&szdata[2*i], "%02X", (unsigned char)data[i]);
szdata[2 * i] = 0;
printf("Hex data: %s\n", szdata);

//转换回来
datalen = strlen(szdata);
for(i = 0; i < datalen / 2; ++i)
sscanf(&data[i], "%02X", &szdata[2 * i]);
data[i] = 0;
printf("Bin data: \n %s\n", data);


btea((long*)data, -n, k); // n为-10,表示解密

printf( "Decrypt Data:\n %s\n", data);
system("pause");
}