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;
}