quck cocos2dx-lua 3.5 版本对图片进行加密
一、图片的加密
使用“pack_list”(这个不知道是出自哪里)进行加密
下载地址 http://pan.baidu.com/s/1gdg2qUf
然后下载“php-5.6.14-nts-Win32-VC11-x86”
打开pack_list,修改pack_files.bat里面的php.exe的目录如下
@echo offset DIR=%~dp0E:\php-5.6.14-nts-Win32-VC11-x86\php.exe "%DIR%lib\pack_files.php" %*
按住shift点击右键,选择“在此处打开命令窗口”,执行
pack_files.bat -h
返回信息如下
options: -h show help -i source files directory -o output filename | output directory -p package prefix name -x excluded packages -m pack mode -ek encrypt key -es encrypt sign -c load options from config file -q quiet pack mode: -m zip package all files to a ZIP archive file and encrypt. -m files (default) save encrypted files to separate files. -o specifies output dir. * default encrypt sign is "XXTEA" config file format: return array( 'src' => source files directory, 'output' => output filename or output directory, 'prefix' => package prefix name, 'excludes' => excluded packages, 'pack' => pack mode, 'key' => encrypt key, 'sign' => encrypt sign, ); examples: # encrypt res/*.* to resnew/, with XXTEA, specifies sign pack_files -i res -o resnew -ek XXTEA -es tsts # package res/*.* to game.zip pack_files -i res -o game.zip -m zip # package scripts/*.* to game.zip, encrypt game.zip with XXTEA, specifies sign pack_files -i scripts -o game.zip -m zip -ek XXTEA -es tsts # load options from config file pack_files -c my_config.lua
输入命令
pack_files.bat -i 需要加密的资源目录 -o 加密后文件存放目录 -ek 你的key -es 你的sign
此时加密就完成了
这个加密是XXTEA方式的,也可用于加密lua脚本
二、图片是加密过的,cocos是不能解析的,需要解密(好像2.x的版本不需要,不知道是不是)
1,若是加密lua脚本(别忘了,先备份源码),只需将你的工程Classes目录下的AppDelegate.cpp文件的
找到下面这行(没有就加上,在LuaStack* stack = engine->getLuaStack();这行下面)
stack->setXXTEAKeyAndSign("2dxLua", strlen("2dxLua"), "XXTEA", strlen("XXTEA"));
把sign和key替换上去,如下,保存
stack->setXXTEAKeyAndSign("你的key", strlen("你的key"), "你的sign", strlen("你的sign"));
重新编译(别忘了,先备份源码),就可以运行加密后的lua脚本了
2,若是加密的图片(这个修改有点麻烦,不会c++所以,一要改c++代码就头疼)
先找到libcocos2d/platform这个目录
然后将:
HelperFunc.cpp和HelperFunc.h (frameworks\cocos2d-x\cocos\quick_libs\src\extra\apptools目录下)
xxtea.cpp和xxtea.h(目录忘了在哪了),
这四个文件都拷贝到platform这个目录下(首先要在资源管理器中复制到platform,然后将platform目录下的这四个文件拖到visual studio中视图中的platform目录)
把HelperFunc.cpp修改如下(主要是去掉了LuaEngine相关的代码,实在不会c++,报错了完全看不懂,所以就直接干掉了)
#include "cocos2d.h" extern "C" { } #include "xxtea/xxtea.h" #include "HelperFunc.h" USING_NS_CC; unsigned char* HelperFunc::getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize) { ssize_t size; unsigned char* buf = FileUtils::getInstance()->getFileData(pszFileName, pszMode, &size); if (NULL == buf || size<1) return NULL; printf("FFF---------------HelperFunc"); //LuaStack* stack = LuaEngine::getInstance()->getLuaStack(); //if (NULL==stack) { // return NULL; //} int xxteaKeyLen = 7; const char *xxteaKey = "xingyun"; int xxteaSignLen = 3; const char *xxteaSign = "ooi"; unsigned char* buffer = NULL; if (xxteaKey && xxteaSign) { bool isXXTEA = true; for (int i = 0; isXXTEA && i<xxteaSignLen && i<size; ++i) { isXXTEA = buf[i] == xxteaSign[i]; } if (isXXTEA) { // decrypt XXTEA xxtea_long len = 0; buffer = xxtea_decrypt( buf + xxteaSignLen, (xxtea_long)size - (xxtea_long)xxteaSignLen, (unsigned char*)xxteaKey, (xxtea_long)xxteaKeyLen, &len); delete[]buf; buf = NULL; size = len; } else { buffer = buf; } } else { buffer = buf; } if (pSize) *pSize = size; return buffer; } int HelperFunc::getFileData(const char *pPathFile) { unsigned long size; unsigned char* buf = HelperFunc::getFileData(pPathFile, "rb", &size); delete buf; /* LuaStack* stack = LuaEngine::getInstance()->getLuaStack(); stack->clean(); if (buf) { stack->pushString((const char*)(buf), (int)size); delete buf; } else { stack->pushNil(); } */ return 1; } Data HelperFunc::getData(const std::string &filename) { unsigned long sz; unsigned char * buf = HelperFunc::getFileData(filename.c_str(), "rb", &sz); if (!buf) { return Data::Null; } Data data; data.fastSet(buf, sz); return data; /* return Data::Null;*/ }
打开platform下的CCImage.cpp,按
将有FileUtils::getInstance()->getDataFromFile的方法都修改如下
//Data data = FileUtils::getInstance()->getDataFromFile(_filePath); Data data = HelperFunc::getData(_filePath);
并在CCImage.cpp文件头部引入HelperFunc.h
#include "HelperFunc.h"
重新编译,就可以加载加密后的文件了(也可以只加密部分文件,部分不加密都行,cocos会自动识别)
三、加密后到android上运行
经过上面两步操作结果发现,虽然在win32下可以运行,但是一到android就黑屏,显示不了图片,说图片格式不支持
弄这个图片加密整整整了两天,终于弄好了,下面是步骤(但具体是那些步骤是必须的还不知道)
复制frameworks\cocos2d-x\cocos\quick_libs\src\extra\apptools
到frameworks\cocos2d-x\extensions\目录,那个xxtea也找到,然后复制到这里
下面是我工程里面现存的有多个叫HelperFunc.cpp的文件,我试着删了一个,但编译就过不了了(所以还是不管了,都留着吧),
但是经过测试发现最终起作用的是
frameworks\cocos2d-x\cocos\quick_libs\src\extra\apptools这个目录里面的
下面是我的工程里的所有的HelperFunc.cpp
frameworks\cocos2d-x\cocos\quick_libs\src\extra\apptoolsframeworks\cocos2d-x\extensions\apptoolsframeworks\cocos2d-x\cocos\platform
使用以下命令将工程编译到android版
cocos compile -p android
若是报HelperFunc或该文件引用的文件缺失,则
修改frameworks\cocos2d-x\cocos\Android.mk,然后重新编译,
由于修改次数过多,我也不知道那些有用,那些没用了
好了,修改完成