当我们做完一个游戏以后,需要对自己图片资源做一定的加密保护,不让别人轻易的破解。cocos官方没有提供资源加密功能,下面提供一种交简单的加解密方案。

一、 生成加密脚本

加密脚本:encode.py(这个脚本会生成加密后的图片替换原始图片)

# -*- coding:UTF-8 -*-
#该脚本用于加密png图片 使用python3以上版本解释执行
__author__ = "ChenGuanzhou"import os
import time
CUR_DIR = os.getcwd() + "\\build\\jsb-link\\assets"  # 编译后资源所在的目录,这里是link模式。
print("cur_dir:",CUR_DIR)
_KEY = "xxxxxxxx"                #指定加密秘钥,英文
_ENCRYSIG = 'jiaozhi'            #添加于文件开头用于判断是否是加密文件
_PNGSIG = bytes([0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a])
_PNGIEND = bytes([0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82])#获取filesig是否是png
def isPNGSig(bytes_8):return bytes_8 == _PNGSIGdef isPNG(absPath):#判断是否是PNG图片""":param absPath: 文件的绝对路径:return: {Bool}"""isFile = os.path.isfile(absPath)hasPNGSig = FalsefileExt = os.path.splitext(absPath)[1]isPngExt = (fileExt == ".png" or fileExt == ".PNG")if isFile and isPngExt:with open(absPath,"rb") as file:hasPNGSig = isPNGSig(file.read(8)[:8])return isFile and isPngExt and hasPNGSigdef preProcessPng(pngData):#预处理图片数据"""剪掉png的signature(8bytes),IEND(12Bytes):param pngData::return:"""assert type(pngData) == byteslostHeadData = pngData[8:]iendData = lostHeadData[-12:]if iendData == _PNGIEND:#防止Png已经进行过外部软件的压缩,丢掉了IENDreturn lostHeadData[:-12]else:return lostHeadDatadef encryption(fileData,key):#加密操作 ascii占一个字节"""加密png数据:param fileData:{bytes}预处理后的png数据:param key:{str}秘钥:return:{bytes}加密后的数据"""assert type(key) is strk = bytes(key,"utf8")klen= len(k)kindex = 0fileData = bytearray(fileData)for i,v in enumerate(fileData):if kindex >= klen:kindex = 0fileData[i] = v ^ k[kindex]#加密kindex = kindex + 1return bytes(_ENCRYSIG,"utf8") + fileData#处理图片
def processPNG(filePath):global filenumfileData = Nonewith open(filePath,'rb') as file:fileData = encryption(preProcessPng(file.read()),_KEY)os.remove(filePath)with open(filePath,'wb') as file: #覆盖新文件file.write(fileData)filenum = filenum + 1def traverseDir(absDir):#遍历当前目录以及递归的子目录,找到所有的png图片""":param absDir: 要遍历的路径:return: None"""assert (os.path.isdir(absDir) and os.path.isabs(absDir))dirName = absDirfor fileName in os.listdir(absDir):absFileName = os.path.join(dirName,fileName)print("isPNG:",absFileName)if os.path.isdir(absFileName):#递归查找文件夹print("absFileName:",absFileName)traverseDir(absFileName)elif isPNG(absFileName):print("isPNG:",absFileName)processPNG(absFileName)else:pass#------------------- 主函数-------------------------#
start_clock = time.clock()
filenum = 0
traverseDir(CUR_DIR)
end_clock = time.clock()
time = (end_clock - start_clock)*1000
print("encrypt %d Png Pictures"%filenum)
print("use time %fms"%time)

接下来做成一个批处理文件: encode.bat

python jm.py
pause

把encode.py 和 encode.bat 一起放到项目根目录下。

二、修改引擎c代码

这里以cocosDashboard 中 creator2.4.3为例。
修改的代码文件位置:
CocosDashboard\resources.editors\Creator\2.4.3\resources\cocos2d-x\cocos\platform中的CCImage.h和CCImage.c

CCImage.h添加:

1、Format 增加文件类型:

/** Supported formats for Image */enum class Format{//! JPEGJPG,//! PNGPNG,//! ENCRYPTEDPNG,下面这行是新加的ENCRYPTEDPNG, //加密后的Png图片//! TIFFTIFF,//! WebPWEBP,//! PVRPVR,//! ETCETC,//! ETC2ETC2,//! S3TCS3TC,//! ATITC
//        ATITC,//! TGATGA,//! Raw DataRAW_DATA,//! Unknown formatUNKNOWN};

2、增加两个方法的定义:

//判断是否是加密图片
bool isEncryptedPng(const unsigned char *data, ssize_t dataLen);
//解密
void deEncryptPng(unsigned char **copyData, const char *key, ssize_t dataLen);

CCImage.c添加:

1、实现Image::isEncryptedPng方法:

bool Image::isEncryptedPng(const unsigned char *data, ssize_t dataLen)
{if (dataLen <= 7 || memcmp("jiaozhi", data, 7) != 0) {return false;}return true;
}

2、实现Image::deEncryptPng解密方法:

void Image::deEncryptPng(unsigned char **copyData, const char *key, ssize_t dataLen) {static const unsigned char PNG_SIGNATURE[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a };static const unsigned char PNG_IEND[] = { 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 };unsigned char* data = *copyData;memcpy(data, PNG_SIGNATURE, 8);memcpy(data + (dataLen - 12), PNG_IEND, 12);unsigned char* destart = data + 8;unsigned char* de_end = data + dataLen - 13;ssize_t keyLen = strlen(key);ssize_t keyIndex = 0;for(; destart <= de_end; destart++, keyIndex++) {if (keyIndex >= keyLen)keyIndex = 0;*destart ^= key[keyIndex];}
}

3、修改检测图片类型的Image::detectFormat方法:

Image::Format Image::detectFormat(const unsigned char * data, ssize_t dataLen)
{if (isPng(data, dataLen)){return Format::PNG;}//新增判断else if (isEncryptedPng(data, dataLen)) {return Format::ENCRYPTEDPNG;}else if (isJpg(data, dataLen)){return Format::JPG;}else if (isTiff(data, dataLen)){return Format::TIFF;}else if (isWebp(data, dataLen)){return Format::WEBP;}else if (isPvr(data, dataLen)){return Format::PVR;}else if (isEtc(data, dataLen)){return Format::ETC;}else if (isS3TC(data, dataLen)){return Format::S3TC;}else{return Format::UNKNOWN;}
}

4、修改Image::initWithImageData,进行解密png

bool Image::initWithImageData(const unsigned char * data, ssize_t dataLen)
{bool ret = false;do{CC_BREAK_IF(! data || dataLen <= 0);unsigned char* unpackedData = nullptr;ssize_t unpackedLen = 0;//detect and unzip the compress fileif (ZipUtils::isCCZBuffer(data, dataLen)){unpackedLen = ZipUtils::inflateCCZBuffer(data, dataLen, &unpackedData);}else if (ZipUtils::isGZipBuffer(data, dataLen)){unpackedLen = ZipUtils::inflateMemory(const_cast<unsigned char*>(data), dataLen, &unpackedData);}else{unpackedData = const_cast<unsigned char*>(data);unpackedLen = dataLen;}_fileType = detectFormat(unpackedData, unpackedLen);switch (_fileType){//这个case块是增加的内容case Format::ENCRYPTEDPNG:{unsigned char* copyData = new unsigned char[unpackedLen + 13]; // 8 + 12 - 7memcpy(copyData + 8, unpackedData + 7, unpackedLen - 7);deEncryptPng(&copyData, "xxxxxxxx", unpackedLen + 13);  //注意这个"xxxxxxxx"是加密时设定的keyret = initWithPngData(copyData, unpackedLen + 13);delete [] copyData;}break;case Format::PNG:ret = initWithPngData(unpackedData, unpackedLen);break;case Format::JPG:ret = initWithJpgData(unpackedData, unpackedLen);break;case Format::TIFF:ret = initWithTiffData(unpackedData, unpackedLen);break;case Format::WEBP:ret = initWithWebpData(unpackedData, unpackedLen);break;case Format::PVR:ret = initWithPVRData(unpackedData, unpackedLen);break;case Format::ETC:ret = initWithETCData(unpackedData, unpackedLen);break;case Format::S3TC:ret = initWithS3TCData(unpackedData, unpackedLen);break;default:{// load and detect image formattImageTGA* tgaData = tgaLoadBuffer(unpackedData, unpackedLen);if (tgaData != nullptr && tgaData->status == TGA_OK){ret = initWithTGAData(tgaData);}else{CCLOG("Image: unsupported image format!");}free(tgaData);break;}}if(unpackedData != data){free(unpackedData);}} while (0);return ret;
}

三、加密操作

1、构建项目生成build文件夹。
2、双击encode.bat 。
3、加密完成,可以进行编译。

文章参考自:http://www.cnblogs.com/pixs-union/p/6226337.html

cocoscreator 资源加密相关推荐

  1. CocosCreator资源加密解密

    分享资源加密插件 | Cocos Store 此插件可解决2.3.x版本和2.4.x版本的web,android,ios以及pc端的资源加密技术. cocos creator资源加密插件

  2. CocoStudio游戏发布后资源加密大致实现思路

    截 止到目前,CocoStudio版本已经发展到1.5,各个子工具间也已经发生了巨大变化.但是,无论是动画编辑器,UI编辑器,场景编辑器还是 数据编辑器,它们生成(导出)的文件在商业开发中往往需要进行 ...

  3. Quick 3.3 的代码资源加密

    http://cn.cocos2d-x.org/tutorial/show?id=1507 http://cn.cocos2d-x.org/tutorial/show?id=1447 http://b ...

  4. HHDBCS及HHDESK的资源加密功能

    安全性,是头等重要的事情.HHDBCS及HHDESK均有一项实用功能,资源加密. HHDBCS 打开HHDBCS,出现连接管理界面(或者在运行过程中,点击连接管理),点击如下图箭头所指处的图标即可 H ...

  5. 实现Android APK加固:代码加密隐藏、资源加密隐藏、so库加密隐藏。兼容unity引擎。附加固工具链接。

    1.为什么做加固 因为不想辛辛苦苦做的东西,被别人拿去改成各种版,半路摘我的桃子. 所以需要将原包的一些核心东西进行加密影藏. 市面上比较好的解决方案就是进行加固,能提升apk安全性. 2.怎么加固 ...

  6. Android APK 加固-支持DEX虚拟化及资源加密

    Android apk加密方案 使用Virbox Protector 加密工具对Android APK进行加密,支持多种保护方式. 功能介绍 反调试功能,可抵挡动态调试,可以避免通过IDA等逆向工具分 ...

  7. 【Android 安全】深思数盾 Virbox 加固应用 ( 购买加固服务 | 下载加固软件 | 启动加固软件 | 函数 VMP 壳设置 | 加密选项 | 资源加密 | SO 保护 )

    文章目录 一.购买加固服务 二.下载加固软件 三.启动加固软件 四.函数 VMP 壳设置 五.加密选项 六.资源加密 七.SO 保护 八.开始加固 一.购买加固服务 深思数盾官网地址 : https: ...

  8. 真正的JavaScript加密和网页资源加密系统,从原理到实现

    网站作为网民获取信息的主要来源之一,基于Html5的建站服务和应用越来越多,而Html5存在一个关键问题: 网页内的资源(包括了javascript.文字.图像等)可以通过非常简单的方式获取! 目前网 ...

  9. Cocos2d-x 资源加密解密实践总结

    本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee 本文针对的是cocos2d-x 3.4 版本进行研究. 做加密解密的思路 加密解密算法 ...

  10. Cocos2d-x客户端资源加密

    安卓打包的apk文件只是做了简单的压缩,通过解压缩可以获取资源文件,如果不想图片资源被别人看到,那么可以对图片进行加密. cocos2d-x提供了xxtea加密和解密算法,先将图片进行加密,这样就打不 ...

最新文章

  1. 有了这款可视化工具,Java 应用性能调优 so easy。。。
  2. 3D视觉原理之深度暗示(即立体感)
  3. java写方法用来调用_Java从入门到入土(79)lambda表达式和方法引用
  4. Android SharedPreferences保存和读取对象
  5. Windows 8计算机管理器怎么打开?
  6. led显示屏p10参数设置_LED显示屏全彩P10的详细参数及说明
  7. 一个容易忽略的问题—Javascript文件加载的顺序
  8. ADO的几种数据库连接方式
  9. 测试工程师不懂AI,还有未来吗?
  10. java中为final变量赋值的几种方式
  11. Java多线程学习六:使用线程池比手动创建线程好在那里以及常用线程池参数的意义
  12. android ListView和GridView拖拽移位具体实现及拓展
  13. mysql设置最大查询时间_mysql如何限制sql查询时间
  14. linux安装启动svn
  15. 后台异常引起前端提示跨域出错
  16. JAVA网络编程——URL
  17. happen-before讲解
  18. 记录docker failed to initialize docker desktop is shutting down解决办法
  19. 计算机里找不到用户文件夹,电脑里面的文件夹不见了,怎么找回
  20. 无线网络加密方式对比 .

热门文章

  1. C++编程的 42 条建议
  2. tomcat 启动出现 org.apache.tomcat.util.compat.JreCompat.isGraalAvailable()Z错误
  3. 特斯拉为什么要“干掉”保险丝和继电器?
  4. 用C++实现布线问题
  5. mysql有varchar2吗_char、varchar、varchar2区别
  6. java web程序设计任务教程——源码(全)
  7. h3c服务器通过pxe安装系统,h3c服务器设置pxe启动
  8. 北理珠大学生体质测试及健康状况的分析
  9. 信息化分析:集团企业信息化规划和实施研究
  10. 微信小游戏开发指南(一)什么是微信小游戏