您的位置:首页 > 移动开发 > Cocos引擎

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.h

01
#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
HelperFunc.cpp

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平台,其他的修改请看续篇。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  quickcocos2dx 加密