TEA加密/解密算法

在游戏项目中,一般需要对资源或数据进行加密保护,最简单高效的加密算法就是采用位与或之类的,但是比较容易被人分析出来。
TEA加密算法不但比较简单,而且有很强的抗差分分析能力,加密速度也比较快。可以根据项目需求设置加密轮数来增加加密强度。
1.加密核心函数

 1 void EncryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key)
 2 {
 3     unsigned int y = *firstChunk;
 4     unsigned int z = *secondChunk;
 5     unsigned int sum = 0;
 6 
 7     unsigned int delta = 0x9e3779b9;
 8 
 9     for (int i = 0; i < 8; i++)//8轮运算(需要对应下面的解密核心函数的轮数一样)
10     {
11         sum += delta;
12         y += ((z << 4) + key[0]) ^ (z + sum) ^ ((z >> 5) + key[1]);
13         z += ((y << 4) + key[2]) ^ (y + sum) ^ ((y >> 5) + key[3]);
14     }
15 
16     *firstChunk = y;
17     *secondChunk = z;
18 }

2.解密核心函数

 1 void DecryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key)
 2 {
 3     unsigned int  sum = 0;
 4     unsigned int  y = *firstChunk;
 5     unsigned int  z = *secondChunk;
 6     unsigned int  delta = 0x9e3779b9;
 7 
 8     sum = delta << 3; //32轮运算,所以是2的5次方;16轮运算,所以是2的4次方;8轮运算,所以是2的3次方
 9 
10     for (int i = 0; i < 8; i++) //8轮运算
11     {
12         z -= (y << 4) + key[2] ^ y + sum ^ (y >> 5) + key[3];
13         y -= (z << 4) + key[0] ^ z + sum ^ (z >> 5) + key[1];
14         sum -= delta;
15     }
16 
17     *firstChunk = y;
18     *secondChunk = z;
19 }

3.封装对输入数据进行加密函数

 1 //buffer:输入的待加密数据buffer,在函数中直接对元数据buffer进行加密;size:buffer长度;key是密钥;
 2 void EncryptBuffer(char* buffer, int size, unsigned int* key)
 3 {
 4     char *p = buffer;
 5 
 6     int leftSize = size;
 7 
 8     while (p < buffer + size &&
 9         leftSize >= sizeof(unsigned int) * 2)
10     {
11         EncryptTEA((unsigned int *)p, (unsigned int *)(p + sizeof(unsigned int)), key);
12         p += sizeof(unsigned int) * 2;
13 
14         leftSize -= sizeof(unsigned int) * 2;
15     }
16 }

4.封装对加密数据进行解密函数

 1 //buffer:输入的待解密数据buffer,在函数中直接对元数据buffer进行解密;size:buffer长度;key是密钥;
 2 void DecryptBuffer(char* buffer, int size, unsigned int* key)
 3 {
 4     char *p = buffer;
 5 
 6     int leftSize = size;
 7 
 8     while (p < buffer + size &&
 9         leftSize >= sizeof(unsigned int) * 2)
10     {
11         DecryptTEA((unsigned int *)p, (unsigned int *)(p + sizeof(unsigned int)), key);
12         p += sizeof(unsigned int) * 2;
13 
14         leftSize -= sizeof(unsigned int) * 2;
15     }
16 }

5.测试加密/解密文件例子(windows下)

 1 //-----设置密钥,必须需要16个字符或以上(这里的长度错误由评论#3楼legion提出修正,表示感谢。)
 2 unsigned int *key = (unsigned int *)"testkey123456789";
 3 //-----读取文件
 4 unsigned int pSize = 0;
 5 char * pBuffer = NULL;
 6 FILE *fp;
 7 int err = fopen_s(&fp, sFileName, "rb"); //sFileName是读取的加密/解密文件名 TODO:处理错误
 8 fseek(fp, 0, SEEK_END);
 9 pSize = ftell(fp); //得到长度
10 fseek(fp, 0, SEEK_SET);
11 pBuffer = new char[pSize]; //开辟内存空间
12 pSize = fread(pBuffer, sizeof(char), pSize, fp); //读取内容
13 fclose(fp); //关闭文件
14 
15 //-----对原始文件进行加密
16 EncryptBuffer(pBuffer, pSize, key);
17 
18 //如果是已经加密过的文件,则对应为解密函数
19 //DecryptBuffer(pBuffer, pSize, key);
20 
21 //-----将数据写入文件当中
22 FILE *fDestFile;
23 fopen_s(&fDestFile, sTagetFileName, "wb"); //sTagetFileName是写入的加密/解密文件名
24 fwrite(pBuffer, sizeof(char), pSize, fDestFile);
25 fclose(fDestFile);//关闭文件
26 
27 delete[]pBuffer;

 

 

PS:

1.对于cocos2d来说,使用pvr或者pvr.ccz等方式也是能加密的,但是在引擎内部进行解密的时候需要开辟一块内存空间进行解密,会提高游戏对内存的需求。所以,直接对读入内存中的文件缓存进行解密可以避免这种情况的发生。

2.在cocos2d-x-3.10\cocos\base里的base64.h & base64.cpp文件里,实现了base64的加解base64Encode/解密base64Decode方法。

转载于:https://www.cnblogs.com/chevin/p/5681228.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TEA算法是一种对称加密算法,它的加密解密过程是相同的。TEA算法加密过程如下: 1. 将明文分成两个32位的块L0和R0。 2. 将L0和R0分别与密钥的前两个32位进行异或运算,得到L1和R1。 3. 将L1和R1分别与密钥的第三个和第四个32位进行异或运算,得到L2和R2。 4. 重复上述步骤,直到得到L16和R16。 5. 将L16和R16合并成一个64位的块,即为密文。 TEA算法解密过程与加密过程类似,只是将密钥的顺序颠倒,即先用密钥的最后两个32位进行异或运算,然后再用前两个32位进行异或运算,最终得到明文。 TEA算法的改进版本有XTEA、XXTEA和BLOCK TEA等,它们的加密过程类似,只是轮数和密钥长度有所不同。 下面是TEA算法Python实现代码: ```python def encrypt_tea(v, k): delta = 0x9e3779b9 sum = 0 k = [k[i:i+4] for i in range(0, len(k), 4)] v = [v[i:i+4] for i in range(0, len(v), 4)] for i in range(32): sum += delta v0 = v[0] v1 = v[1] v[0] += ((v[1] << 4) + int(k[i%4])) ^ (v[1] + sum) ^ ((v[1] >> 5) + int(k[(i+1)%4])) v[1] += ((v[0] << 4) + int(k[(i+2)%4])) ^ (v[0] + sum) ^ ((v[0] >> 5) + int(k[(i+3)%4])) return b''.join(v) def decrypt_tea(v, k): delta = 0x9e3779b9 sum = delta * 32 k = [k[i:i+4] for i in range(0, len(k), 4)] v = [v[i:i+4] for i in range(0, len(v), 4)] for i in range(32): v1 = v[1] v0 = v[0] v[1] -= ((v[0] << 4) + int(k[(i+2)%4])) ^ (v[0] + sum) ^ ((v[0] >> 5) + int(k[(i+3)%4])) v[0] -= ((v[1] << 4) + int(k[i%4])) ^ (v[1] + sum) ^ ((v[1] >> 5) + int(k[(i+1)%4])) sum -= delta return b''.join(v) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值