C++ XXTEA加密解密算法

        微型加密算法(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");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值