1,QQ基于腾讯自己的xxtea算法加密手段,咱就先尝试使用一下xxtea算法,网上找了一些版本,也使用了一些现有的版本,数据都可以正常使用,瞅瞅就好
2,tea加密的秘钥是四组,总长度是16个字节,可以选择直接定义4组4字节长度的秘钥,也可以和我一样,用unsigned char定义之后,再传入的时候强转一下就行。
3,代码里面给的两种方式其实差不多一样,毕竟这个算法本身也没几行代码,写不出个花来,一个是在内部根据传入的参数判断是进行加密还是解密操作,一个是直接确定解密的时候用解密函数,加密的时候用加密函数,至于如果需要加密的数据长度不足如何填充,这个暂时还没学习了解。
4,代码就是下面的代码,各位大哥大姐如有想法,可以交流交流。
#include"pch.h" #include#include #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; }



