适用于 Quick-Cocos2dx-Community 3.7.x 和 Cocos2d-Lua-Community 4.x
在3.7以上版本中,game32.zip将视为资源,使用同一套加密方式。
$/xxx/Quick-Cocos2dx-Community/quick/bin/EncodeRes.py -p /Users/u0u0/Desktop/testProject -s ASig -k /Users/u0u0/Desktop/key.png
新的加密脚本以文件作为key,支持二进制的key。事实上xxtea加密的key固定位16个字节128bit,也就是只取文件的前16字节作为key来加密。
例中,加密 res 资源文件下的二进制数据(参考py脚本中的过滤),原未加密的文件会备份到res_bk文件夹。
在AppDelegate.cpp中加入解码信息。
FileUtils::getInstance()->setFileDataDecoder(decoder);
3.7使用外部解码函数嵌入到引擎的file移植层的方式来提供自定义解码方案,也就是你可以用自己的加密方案和解密方案来替换引擎的默认方案,灵活性更高。
AppDelegate中提供默认的解码函数。实现如下:
static void decoder(Data &data)
{
unsigned char sign[] = "ASig";
unsigned char key[16] = {
0x89, 0x50, 0x4E, 0x47,
0x0D, 0x0A, 0x1A, 0x0A,
0x00, 0x00, 0x00, 0x0D,
0x49, 0x48, 0x44, 0x52
};
// decrypt XXTEA
if (!data.isNull()) {
bool isEncoder = false;
unsigned char *buf = data.getBytes();
ssize_t size = data.getSize();
ssize_t len = strlen((char *)sign);
if (size <= len) {
return;
}
for (int i = 0; i < len; ++i) {
isEncoder = buf[i] == sign[i];
if (!isEncoder) {
break;
}
}
if (isEncoder) {
xxtea_long newLen = 0;
unsigned char* buffer = xxtea_decrypt(buf + len,
(xxtea_long)(size - len),
(unsigned char*)key,
(xxtea_long)sizeof(key),
&newLen);
data.clear();
data.fastSet(buffer, newLen);
}
}
}