XXTEA算法使用C语言实现

1,QQ基于腾讯自己的xxtea算法加密手段,咱就先尝试使用一下xxtea算法,网上找了一些版本,也使用了一些现有的版本,数据都可以正常使用,瞅瞅就好

2,tea加密的秘钥是四组,总长度是16个字节,可以选择直接定义4组4字节长度的秘钥,也可以和我一样,用unsigned char定义之后,再传入的时候强转一下就行。

3,代码里面给的两种方式其实差不多一样,毕竟这个算法本身也没几行代码,写不出个花来,一个是在内部根据传入的参数判断是进行加密还是解密操作,一个是直接确定解密的时候用解密函数,加密的时候用加密函数,至于如果需要加密的数据长度不足如何填充,这个暂时还没学习了解。

4,代码就是下面的代码,各位大哥大姐如有想法,可以交流交流。

#include"pch.h"
#include<stdio.h>
#include<stdint.h>
#define DELTA 0x9E3779B9
#define MX (((z>>5^y<<2)+(y>>3^z<<4))^((sum^y)+(k[(p&3)^e]^z)))
void btea(uint32_t *v, int n, uint32_t const k[4])
{
	uint32_t y, z, sum;
	unsigned p, rounds, e;
	if (n > 1)
	{
		rounds = 6 + 52 / n;	//这里可以说是预定义值,n=2是rounds=32
		sum = 0;
		z = v[n - 1];
		do
		{
			sum += DELTA;
			e = (sum >> 2) & 3;
			for (p = 0; p < n - 1; p++)        //注意这里的p是从0~n-1
			{
				y = v[p + 1];
				z = v[p] += MX;
			}
			y = v[0];
			z = v[n - 1] += MX;        //这里的MX中传入的p=n-1
		} while (--rounds);
	}
	else if (n < -1)
	{
		n = -n;
		rounds = 6 + 52 / n;
		sum = rounds * DELTA;
		y = v[0];
		do
		{
			e = (sum >> 2) & 3;
			for (p = n - 1; p > 0; p--)    //注意这里的p是从n-1~0,和上面是反过来的
			{
				z = v[p - 1];
				y = v[p] -= MX;
			}
			z = v[n - 1];
			y = v[0] -= MX;    //这里的MX中传入的 p=0
			sum -= DELTA;
		} while (--rounds);
	}
}
void xxteaencrypt(uint32_t*v, uint32_t len, uint32_t*k) {
	uint32_t n = len - 1;
	uint32_t z = v[n], y = v[0], p, q = 6 + 52 / (n + 1), sum = 0, e;
	if (n < 1) {
		return;
	}
	while (0 < q--) {
		sum += DELTA;
		e = sum >> 2 & 3;
		for (p = 0; p < n; p++) {
			y = v[p + 1];
			z = v[p] += MX;
		}
		y = v[0];
		z = v[n] += MX;
	}
}

void xxteadecrypt(uint32_t*v, uint32_t len, uint32_t*k) {
	if (len == 0)
		return;
	uint32_t n = len - 1;
	uint32_t z = v[n], y = v[0], p, q = 6 + 52 / (n + 1), sum = q * DELTA, e;
	if (n < 1) {
		return;
	}
	while (sum != 0) {
		e = sum >> 2 & 3;
		for (p = n; p > 0; p--) {
			z = v[p - 1];
			y = v[p] -= MX;
		}
		z = v[n];
		y = v[0] -= MX;
		sum -= DELTA;
	}
}
int main()
{
	unsigned char v[] = { 0x63,0x68,0x75,0x61,0x6E,0x67,0x71,0x69,0x61,0x6E,0x6D,0x69,0x6E,0x67,0x79,0x75,0x65,0x67,0x75,0x61,0x6E,0x67,0x31,0x31,0x31,0x31,0x31,0x68,0x61,0x68,0x61,0x61 };//需要加密或者解密的数据
	unsigned char k[] = { 0x98, 0xff, 0x34, 0x8c, 0x0c, 0x9d,0xac, 0x6e, 0xc9, 0x86, 0xd3, 0x90, 0xdc, 0x22,
	0xc4, 0xb3 };//秘钥
	int n = (sizeof(v) / sizeof(char)) / 4;
	xxteaencrypt((uint32_t*)v, n, (uint32_t*)k);//可以顺利加密
	xxteadecrypt((uint32_t*)v, n, (uint32_t*)k);//可以顺利解密
	printf("测试第二种");
	btea((uint32_t*)v, n, (uint32_t*)k);//可以顺利加密,n为正,加密,n为负,解密
	btea((uint32_t*)v, -n, (uint32_t*)k);//可以顺利解密
	return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值