博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cocos2d-x客户端资源加密
阅读量:6984 次
发布时间:2019-06-27

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

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

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

 

一、下载quick-cocos2d-x

 

quick-cocos2d-x封装了一套加密的工具,先下载quick-cocos2d-x,git地址。

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

 

二、加密

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

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

 

编写打包资源脚本

 

[plain] 
 
 
  1. ::res_pack.bat  
  2.   
  3. set DSRC=E:\Cocos2d\Cocos2d-x\Projects\Game_Lua\res  
  4. set ESRC=E:\Cocos2d\Cocos2d-x\Projects\Game_Lua\assets  
  5.   
  6. cd bin  
  7.   
  8. pack_files.bat -i %DSRC% -o %ESRC% -ek 123456 -es test  

 

 

加密后的图片文件:

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

 

二、解密

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

 

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

 

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

 

[cpp] 
 
 
  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.   
  10.     if (strncmp(sign, (const char*)dataBytes, signLen) != 0)  
  11.     {  
  12.         return;  
  13.     }  
  14.     xxtea_long retLen = 0;  
  15.     unsigned char* retData = xxtea_decrypt(dataBytes+signLen, dataLen-signLen, (unsigned char*)key, keyLen, &retLen);  
  16.     data->fastSet(retData, retLen);  
  17. }  

 

 

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

 

至此资源加密完成。

你可能感兴趣的文章
GLSL三种修饰符区别与用途(uniform,attribute和varying)
查看>>
python django django-debug-toolbar 加载缓慢,不能使用。
查看>>
操作系之进程调度及算法详解
查看>>
PHPexcel实列
查看>>
Butterknife 的简单使用 和 配合 Butterknife的插件 Zelezny
查看>>
Magento利用input type=”file”上传图片
查看>>
Android音频开发(4):如何存储和解析wav文件
查看>>
Handler延迟事件使用
查看>>
【DG】Oracle 19c使用dbca来搭建物理DG
查看>>
Cython安装
查看>>
StringBuilder 、StringBuffer 、 String
查看>>
brew install php55 报错 clang: error
查看>>
ubuntu18.4 安装swoole 和 php 扩展 swoole
查看>>
pcDuino入门心得+HDMI声音+蓝牙功放
查看>>
面向对象2
查看>>
c++测试题2016-6-2
查看>>
Nginx与Serssion一致性问题
查看>>
社会化工程攻击针对目标不再仅限最终用户
查看>>
Hadoop源码分析HDFS ClientProtocol——getBlockLocations
查看>>
AndroidWidget实践 --- EverydayTips开发(6)
查看>>