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

 void EncryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key)
{
unsigned int y = *firstChunk;
unsigned int z = *secondChunk;
unsigned int sum = ; unsigned int delta = 0x9e3779b9; for (int i = ; i < ; i++)//8轮运算(需要对应下面的解密核心函数的轮数一样)
{
sum += delta;
y += ((z << ) + key[]) ^ (z + sum) ^ ((z >> ) + key[]);
z += ((y << ) + key[]) ^ (y + sum) ^ ((y >> ) + key[]);
} *firstChunk = y;
*secondChunk = z;
}

2.解密核心函数

 void DecryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key)
{
unsigned int sum = ;
unsigned int y = *firstChunk;
unsigned int z = *secondChunk;
unsigned int delta = 0x9e3779b9; sum = delta << ; //32轮运算,所以是2的5次方;16轮运算,所以是2的4次方;8轮运算,所以是2的3次方 for (int i = ; i < ; i++) //8轮运算
{
z -= (y << ) + key[] ^ y + sum ^ (y >> ) + key[];
y -= (z << ) + key[] ^ z + sum ^ (z >> ) + key[];
sum -= delta;
} *firstChunk = y;
*secondChunk = z;
}

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

 //buffer:输入的待加密数据buffer,在函数中直接对元数据buffer进行加密;size:buffer长度;key是密钥;
void EncryptBuffer(char* buffer, int size, unsigned int* key)
{
char *p = buffer; int leftSize = size; while (p < buffer + size &&
leftSize >= sizeof(unsigned int) * )
{
EncryptTEA((unsigned int *)p, (unsigned int *)(p + sizeof(unsigned int)), key);
p += sizeof(unsigned int) * ; leftSize -= sizeof(unsigned int) * ;
}
}

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

 //buffer:输入的待解密数据buffer,在函数中直接对元数据buffer进行解密;size:buffer长度;key是密钥;
void DecryptBuffer(char* buffer, int size, unsigned int* key)
{
char *p = buffer; int leftSize = size; while (p < buffer + size &&
leftSize >= sizeof(unsigned int) * )
{
DecryptTEA((unsigned int *)p, (unsigned int *)(p + sizeof(unsigned int)), key);
p += sizeof(unsigned int) * ; leftSize -= sizeof(unsigned int) * ;
}
}

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

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

PS:

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

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

TEA加密/解密算法的更多相关文章

  1. 数据的加密传输——单片机上实现TEA加密解密算法

    各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性.常用的加密解密算法比如DES.RSA等,受限于单片机的内存和运算速度,实 ...

  2. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  3. 一组PHP可逆加密解密算法

    对于大部分密码加密,我们可以采用md5.sha1等方法.可以有效防止数据泄露,但是这些方法仅适用于无需还原的数据加密. 对于需要还原的信息,则需要采用可逆的加密解密算法. 下面一组PHP函数是实现此加 ...

  4. RC4加密解密算法

    RC4相对是速度快.安全性高的加密算法.在实际应用中,我们可以对安全系数要求高的文本进行多重加密,这样破解就有一定困难了.如下测试给出了先用RC4加密,然后再次用BASE64编码,这样双重锁定,保证数 ...

  5. java 实现 DES加密 解密算法

    DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...

  6. md5加密以及可逆的加密解密算法

    md5加密 package gov.mof.fasp2.gcfr.adjustoffset.adjust; import java.security.MessageDigest; public cla ...

  7. N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列。设计加密解密算法,且要求K<=15*N.

    N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列.设计加密解密算法,且要求K<=15*N. ...

  8. RSA加密解密算法

    /** * RSA加密解密算法 * Class Rsa */ class Rsa { /** * 获取pem格式的公钥 * @param $public_key 公钥文件路径或者字符串 * @retu ...

  9. php与java通用AES加密解密算法

    AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的 ...

随机推荐

  1. bzoj4861 / P3715 [BJOI2017]魔法咒语

    P3715 [BJOI2017]魔法咒语 AC自动机+dp+矩阵乘法 常规思路是按基本串建立AC自动机 然鹅这题是按禁忌串建立AC自动机 对后缀是禁忌的点以及它的失配点做上标记$(a[i].ed)$, ...

  2. java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy解决方法

    今天集成es-job到公司的框架时,启动时出现上述错误 java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy at storm. ...

  3. protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 2, class-id=60, method-id=80)

    Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; reason: {#method<channel.c ...

  4. 【题解】 Luogu P4312 / SP4155 [COCI 2009] OTOCI / 极地旅行社

    原题地址:P4312 [COCI 2009] OTOCI / 极地旅行社/SP4155 OTOCI - OTOCI lct入门难度的题,十分弱智(小蒟蒻说lct是什么,能吃吗?) bridge操作判联 ...

  5. 让bat批处理后台运行,不显示cmd窗口(完全静化)

    背景:由于我有某云的服务器(win server), 上面挂有好几个程序, 为了更好的监控他们, 我使用了一个最笨的方法, 就是下面的方法. 实现:我要监控的程序有三个, 成为ABC吧, 下面先把三个 ...

  6. Eclipse中ctrl+shift+r与ctrl+shift+t的区别

    eclipse中的两个常用的快捷键可以大大提升查找文件的效率,分别是: ctrl+shift+r : open resource, 打开资源. 它可以打开当前eclipse的工作区中所有(打开的)工程 ...

  7. CIL锁,GIL与线程池的区别,进程池和线程池,同步与异步

    一.GIL锁 什么是GIL? 全局解释器锁,是加在解释器上的互斥锁 GC是python自带的内存管理机制,GC的工作原理:python中的内存管理使用的是应用计数,每个数会被加上一个整型的计数器,表示 ...

  8. vector at()函数比 []运算符操作安全

    转载:https://blog.csdn.net/chenjiayi_yun/article/details/18507659 []操作符的源码 reference operator[](size_t ...

  9. noip模拟【array】

    array by ysy [题目描述] 给定一个长度为n的数列,每次你可以进行以下操作之一: (1)将一个数+a: (2)将一个数-a: (3)将一个数+b: (4)将一个数-b: 你需要将所有数全部 ...

  10. P4782 【模板】2-SAT 问题

    https://www.luogu.org/problemnew/show/P4782 链接 https://www.luogu.org/problemnew/show/P4782 思路 选a就必须选 ...