加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Cocos2d-x客户端资源加密

发布时间:2020-12-14 16:57:39 所属栏目:百科 来源:网络整理
导读:安卓打包的apk文件只是做了简单的压缩,通过解压缩可以获取资源文件,如果不想图片资源被别人看到,那么可以对图片进行加密。 cocos2d-x提供了xxtea加密和解密算法,先将图片进行加密,这样就打不开图片了,然后在CCImage解析图片的时候进行解密即可。 一、

安卓打包的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-xexternalxxtea目录下查看。

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


编写打包资源脚本

::res_pack.bat

set DSRC=E:Cocos2dCocos2d-xProjectsGame_Luares
set ESRC=E:Cocos2dCocos2d-xProjectsGame_Luaassets

cd bin

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方法。

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

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

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

void Image::image_decrypt(Data *data)
{
	const char* key = "123456";
	const char* sign = "test";
	unsigned char* dataBytes = data->getBytes();
	ssize_t dataLen = data->getSize();
	ssize_t signLen = strlen(sign);
	ssize_t keyLen = strlen(key);

	if (strncmp(sign,(const char*)dataBytes,signLen) != 0)
	{
		return;
	}
	xxtea_long retLen = 0;
	unsigned char* retData = xxtea_decrypt(dataBytes+signLen,dataLen-signLen,(unsigned char*)key,keyLen,&retLen);
	data->fastSet(retData,retLen);
}


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




至此资源加密完成。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读