安卓打包的apk文件只是做了简单的压缩,通过解压缩可以获取资源文件,如果不想图片资源被别人看到,那么可以对图片进行加密。

cocos2d-x提供了xxtea加密和解密算法,先将图片进行加密,这样就打不开图片了,然后在CCImage解析图片的时候进行解密即可。


一、下载quick-cocos2d-x


quick-cocos2d-x封装了一套加密的工具,先下载quick-cocos2d-x,git地址​​https://github.com/dualface/v3quick​​。

解压之后把bin目录拷贝到我们的cocos2d-x工程根目录。

Cocos2d-x客户端资源加密_lua


二、加密

quick-cocos2d-x提供了pack_files命令,可以将图片进行加密,加密算法用的是xxtea,你可以到cocos2d-x\external\xxtea目录下查看。

到bin目录打开命令行窗口,执行pack_files.bat -h 可以查看pack_files的使用方法。

Cocos2d-x客户端资源加密_解压缩_02


编写打包资源脚本


[plain]​view plain​​​ ​​copy​


  1. ::res_pack.bat

  2. set DSRC=E:\Cocos2d\Cocos2d-x\Projects\Game_Lua\res
  3. set ESRC=E:\Cocos2d\Cocos2d-x\Projects\Game_Lua\assets

  4. cd bin

  5. pack_files.bat -i %DSRC% -o %ESRC% -ek 123456 -es test






打开游戏则会报错,unsupport image format,因为每种图片的前面一些字节是这种图片类型的标记,比如png的前面8个字节固定是0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a。因为已经被加密了,所以识别不了图片格式。

Cocos2d-x客户端资源加密_解压缩_03


二、解密

所有图片的加载都封装在CCImage类的initWithImageFile和initWithImageFileThreadSafe方法。


[cpp]​view plain​​​ ​​copy​


  1. // initWithImageFile
  2. Data data = FileUtils::getInstance()->getDataFromFile(_filePath);

  3. if (!data.isNull())
  4. {
  5. ret = initWithImageData(data.getBytes(), data.getSize());
  6. }



封装一个解密方法,参数是Data类型的,然后再用解密后的数据去加载图片。


[cpp]​view plain​​​ ​​copy​


  1. void Image::image_decrypt(Data *data)
  2. {
  3. const char* key = "123456";
  4. const char* sign = "test";
  5. unsigned char* dataBytes = data->getBytes();
  6. ssize_t dataLen = data->getSize();
  7. ssize_t signLen = strlen(sign);
  8. ssize_t keyLen = strlen(key);

  9. if (strncmp(sign, (const char*)dataBytes, signLen) != 0)
  10. {
  11. return;
  12. }
  13. xxtea_long retLen = 0;
  14. unsigned char* retData = xxtea_decrypt(dataBytes+signLen, dataLen-signLen, (unsigned char*)key, keyLen, &retLen);
  15. data->fastSet(retData, retLen);
  16. }




分别在initWithImageFile和initWithImageFileThreadSafe方法中调用。


Cocos2d-x客户端资源加密_lua_04

Cocos2d-x客户端资源加密_安卓打包_05


至此资源加密完成。