|
在游戏项目中,一般需要对zy或xx进行加密保护,最简单高效的加密算法就是采用位与或之类的,但是比较容易被人分析出来。
TEA加密算法不但比较简单,而且有很强的抗差分分析能力,加密速度也比较快。可以根据项目需求设置加密轮数来增加加密强度。
1.加密核心函数
static void tea_encrypt(uint32_t *v,uint32_t *k)
{
uint32_t y = v[0],z = v[1],sum = 0,i;
uint32_t delta = 0xcccccccc;
uint32_t a = k[0],b = k[1],c = k[2],d = k[3];
for (i = 0;i < 32;i++)
{
sum += delta;
y += ((z << 2) + a) ^ (z + sum) ^ ((z >> 7) + b);
z += ((y << 2) + c) ^ (y + sum) ^ ((y >> 7) + d);
}
v[0] = y;
v[1] = z;
}
uint16_t encrypt(uint8_t *src,uint16_t size_src,uint8_t *key)
{
uint8_t a = 0;
uint16_t i = 0;
uint16_t num = 0;
//将明文补足为8字节的倍数
a = size_src % 8;
if (a != 0)
{
for (i = 0;i < 8 - a;i++)
{
src[size_src++] = 0;
}
}
//加密
num = size_src / 8;
for (i = 0;i < num;i++)
{
tea_encrypt((uint32_t *)(src + i * 8),(uint32_t *)key);
}
return size_src;
解密函数
static void tea_decrypt(uint32_t *v,uint32_t *k)
{
uint32_t y = v[0],z = v[1],sum = 0xC6EF3720,i;
uint32_t delta = 0xcccccccc;
uint32_t a = k[0],b = k[1],c = k[2],d = k[3];
for (i = 0;i < 32;i++)
{
z -= ((y << 2) + c) ^ (y + sum) ^ ((y >> 7) + d);
y -= ((z << 2) + a) ^ (z + sum) ^ ((z >> 7) + b);
sum -= delta;
}
v[0] = y;
v[1] = z;
}
uint16_t decrypt(uint8_t *src,uint16_t size_src,uint8_t *key)
{
uint16_t i = 0;
uint16_t num = 0;
//判断长度是否为8的倍数
if (size_src % 8 != 0)
{
return 0;
}
//解密
num = size_src / 8;
for (i = 0;i < num;i++)
{
tea_decrypt((uint32_t *)(src + i * 8),(uint32_t *)key);
}
return size_src;
}
|
|