Cocos2d-x客户端资源加密

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

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


一、下载quick-cocos2d-x

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

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


二、加密

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

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


编写打包资源脚本

[plain] view plain copy
  1. ::res_pack.bat
  2. setDSRC=E:\Cocos2d\Cocos2d-x\Projects\Game_Lua\res
  3. setESRC=E:\Cocos2d\Cocos2d-x\Projects\Game_Lua\assets
  4. cdbin
  5. pack_files.bat-i%DSRC%-o%ESRC%-ek123456-estest

加密后的图片文件

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

二、解密

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

[cpp] copy
    //initWithImageFile
  1. Datadata=FileUtils::getInstance()->getDataFromFile(_filePath);
  2. if(!data.isNull())
  3. {
  4. ret=initWithImageData(data.getBytes(),data.getSize());
  5. }

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

voidImage::image_decrypt(Data*data)

  • {
  • constchar*key="123456";
  • char*sign="test";
  • unsignedchar*dataBytes=data->getBytes();
  • ssize_tdataLen=data->getSize();
  • ssize_tsignLen=strlen(sign);
  • ssize_tkeyLen=strlen(key);
  • if(strncmp(sign,(char*)dataBytes,signLen)!=0)
  • return;
  • }
  • xxtea_longretLen=0;
  • char*retData=xxtea_decrypt(dataBytes+signLen,dataLen-signLen,(unsignedchar*)key,keyLen,&retLen);
  • data->fastSet(retData,retLen);
  • }

  • 分别在initWithImageFile和initWithImageFileThreadSafe方法调用

    相关文章

        本文实践自 RayWenderlich、Ali Hafizji 的文章《...
    Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
    第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
        Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
    1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
       Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...