quick-cocos2d-x图片资源加密 (转)
2014-05-08 22:24
423 查看
quick-x已经支持用XXTEA加密方式对脚本文件进行加密。在此基础上,自己做了一些工作,对图片资源进行了XXTEA加密,现分享给大家。
首先我们要有对图片加密的工具。这个参考compile_scripts脚本,写一个用于加密的脚本就可以了。我自己写的脚本放在这里,大家可以下载使用。(之前没用过php,完全是照着廖大的脚本修改成的,有写得不好的地方还请多多包涵,呵呵)
脚本使用的方法和compile_scripts脚本差不多,将zip包里的文件解压到quick-x的bin目录下就可以用了。
在Windows命令行下,输入以下指令(请确认环境变量PATH里有quick-x的bin目录,否则需要自己加运行路径)
1 | pack_files.bat -i olddir -o newdir -ek XXTEA -es tsts |
以上指令是将olddir目录下的所有文件用XXTEA加密后,放到newdir目录下,其中加密密匙为XXTEA,加密记号为tsts。参数的定义与compile_scripts脚本类似,用-h也可以得到帮助,也不多说了。
MAC下可以用pack_files.sh来加密。
需要注意的是,现在只支持图片的加密。比如AllSprites.plist和AllSprites.png这样的一对纹理文件,只能加密png文件,plist文件加密后是用不了的。(注:现在已经支持plist文件,请看“后篇”里的内容)
文件加密好以后,我们需要修改quick-x的平台代码,使得它能够读取加密后的文件。
载入图片的函数是lib\cocos2d-x\cocos2dx\platform\CCImageCommon_cpp.h里面的CCImage::initWithImageFile()和CCImage::initWithImageFileThreadSafe()。再进一步看,这两个函数里都是使用CCFileUtils::sharedFileUtils()->getFileData()来获得文件数据的,我们只需要在获取数据时把文件数据解密即可。
为此我们需要专门写一个新的getFileData()来代替调用。直接写一个是可以的,放在哪个文件里也不重要。因为我自己有一个HelperFunc模块,专门放自己增加的功能的,所以我就写在这里面了。文件里的相关代码如下:
HelperFunc.h01 | #ifndef Cocos2Dx_HelperFunc_h |
02 | #define Cocos2Dx_HelperFunc_h |
03 |
04 | NS_CC_BEGIN |
05 |
06 | class CZHelperFunc |
07 | { |
08 | public : |
09 | static unsigned char * getFileData( const char * pszFileName, const char * pszMode, unsigned long * pSize); |
10 |
11 | }; |
12 |
13 | NS_CC_END |
14 |
15 | #endif //Cocos2Dx_HelperFunc_h |
01 | #include "cocos2d.h" |
02 | extern "C" { |
03 | #include "lua.h" |
04 | #include "xxtea.h" |
05 | } |
06 | #include "CCLuaEngine.h" |
07 | #include "HelperFunc.h" |
08 |
09 | USING_NS_CC; |
10 |
11 | unsigned char * CZHelperFunc::getFileData( const char * pszFileName, const char * pszMode, unsigned long * pSize) |
12 | { |
13 | unsigned long size; |
14 | unsigned char * buf = CCFileUtils::sharedFileUtils()->getFileData(pszFileName, pszMode, &size); |
15 | if (NULL==buf) return NULL; |
16 |
17 | CCLuaStack* stack = CCLuaEngine::defaultEngine()->getLuaStack(); |
18 | unsigned char * buffer = NULL; |
19 |
20 | bool isXXTEA = stack && stack->m_xxteaEnabled; |
21 | for (unsigned int i = 0 ; isXXTEA && i < stack->m_xxteaSignLen && i < size; ++i) |
22 | { |
23 | isXXTEA = buf[i] == stack->m_xxteaSign[i]; |
24 | } |
25 |
26 | if (isXXTEA) |
27 | { |
28 | // decrypt XXTEA |
29 | xxtea_long len = 0 ; |
30 | buffer = xxtea_decrypt(buf + stack->m_xxteaSignLen, |
31 | (xxtea_long)size - (xxtea_long)stack->m_xxteaSignLen, |
32 | (unsigned char *)stack->m_xxteaKey, |
33 | (xxtea_long)stack->m_xxteaKeyLen, |
34 | &len); |
35 | delete []buf; |
36 | buf = NULL; |
37 | size = len; |
38 | } |
39 | else |
40 | { |
41 | buffer = buf; |
42 | } |
43 |
44 | if (pSize) *pSize = size; |
45 | return buffer; |
46 | } |
因为上面代码里直接使用了CCLuaStack里的密匙等数据,所以要修改一下lib\cocos2d-x\scripting\lua\cocos2dx_support\CCLuaStack.h,把里面的几个属性改成公有的才能调用。当然我这是偷懒了,安全的做法应该是加几个取值的方法,呵呵。
1 | public : |
2 | bool m_xxteaEnabled; |
3 | char *m_xxteaKey; |
4 | int m_xxteaKeyLen; |
5 | char *m_xxteaSign; |
6 | int m_xxteaSignLen; |
另外,我们需要在程序启动时设置一下密匙和标记,这就要修改AppDelegate.cpp里的AppDelegate::applicationDidFinishLaunching(),在下面这句:
1 | CCLuaStack *pStack = pEngine->getLuaStack(); |
这句后面加上:
1 | pStack->setXXTEAKeyAndSign( "XXTEA" , strlen( "XXTEA" ), "tsts" , strlen( "tsts" )); |
注意最新版本的quick-x里,player的AppDelegate.cpp修改的地方是StartupCall::startup()函数。
现在把CCImageCommon_cpp.h里的CCFileUtils::sharedFileUtils()->getFileData改为CZHelperFunc::getFileData就可以了。当然,必须包含HelperFunc.h这个头文件才能编译通过。
(注:initWithImageFileThreadSafe函数里有一段代码是在Android平台上使用getFileDataForAsync来取文件内容,我开始这里没做修改也能在Android上正常运行,可能是因为我没使用到这一载入功能。其实这段代码可以直接去掉,都用CZHelperFunc::getFileData来处理就好。最简单的修改是将“#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)“改成”#if 0"就可以了)
经过以上修改,quick-x就能够使用加密后的图片资源了。但这只解决了Windows平台(player)和Android平台,其他的修改请看续篇。
相关文章推荐
- quick-cocos2d-x图片资源加密(续)
- quick-cocos2d-x图片资源加密
- quick-cocos2d-x 图片资源加密
- quick-cocos2d-x图片资源加密(续)
- quick-cocos2d-x图片资源加密(续)
- quick-cocos2d-x 脚本和资源加密
- 【加密】Cocos2d-x PNG图片资源加密(修改版)
- 【Cococs2d-x】通过TexturePacker加密图片资源(Cocos2d-x方式)
- Cocos2d-x PNG图片资源加密
- 【原创教程】Quick-Cocos2d-x的资源加密
- Cocos2d-lua 3.10 图片资源加密
- 【Cocos2d-x 手游研发小技巧】图片资源加密,Lua文件加密
- 【加密】Cocos2d-x PNG图片资源加密(修改版)
- 【加密】Cocos2d-x PNG图片资源加密
- Cocos2d-x 游戏资源(图片、XML、TXT等)打包加密 之 解密读取
- 【Cococs2d-x】通过TexturePacker加密图片资源(Cocos2d-x方式)
- quick-x 图片资源加密
- Cococs2d-x通过TexturePacker加密图片资源(Cocos2d-x方式)
- 通过TexturePacker加密图片资源(Cocos2d-x方式)
- 【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】