博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TEA加密/解密算法
阅读量:6633 次
发布时间:2019-06-25

本文共 3333 字,大约阅读时间需要 11 分钟。

在游戏项目中,一般需要对资源或数据进行加密保护,最简单高效的加密算法就是采用位与或之类的,但是比较容易被人分析出来。

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

你可能感兴趣的文章
Oracle 12c 安装手册
查看>>
把 HttpHandler.ashx 修改为 异步编程 异步操作
查看>>
菜鸟学Java(九)——Servlet的基本配置
查看>>
设计模式学习--面向对象的5条设计原则之单一职责原则--SRP
查看>>
PostgreSQL的HOT(Heap-Only Tuples)
查看>>
FEC难:
查看>>
difference between TotalFreeSpace and AvailableFreeSpace
查看>>
javascript面向对象的一些写法
查看>>
图片存储那些事
查看>>
lua中常量的实现及表的深拷贝实现
查看>>
Transformer中引用iqd作为数据源的时候数据预览出现乱码
查看>>
UML--核心元素之业务实体
查看>>
使用JAVA的URL类处理url事例
查看>>
C链表
查看>>
安装C/C++交叉编译环境
查看>>
Extjs4.x 共享组件,写法
查看>>
一段测试try...catch运行时间的代码
查看>>
C++读写文件流的相关介绍
查看>>
sql, plsql 总结
查看>>
JavaScript类型转换
查看>>