【原创教程】Quick-Cocos2d-x的资源加密

前端之家收集整理的这篇文章主要介绍了【原创教程】Quick-Cocos2d-x的资源加密前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在实际开发中,我们开发的游戏在发布的时候往往需要把资源加密。如果我们自己来做这些操作的话,无疑是一项很繁琐的工作。好在Quick中给我们提供了完整的一套解决方案。

在Quick中提供了两个加密的脚本,一个是对lua脚本进行加密的脚本,另外一个是对图片等资源进行加密的脚本。

我们打开Quick引擎下的bin目录,能够看到一些脚本,其中4个脚本是加密用的。

  • compile_scripts.bat: windows下对脚本进行加密的批处理文件
  • compile_scripts.sh: mac或者linux下对脚本进行加密的脚本文件
  • pack_files.bat: windows下对资源文件打包的批处理文件
  • pack_files.sh: mac或者linux下对资源文件打包的脚本文件

脚本加密

因为Quick里的加密是通过LuaJIT来实现的,所以我们在使用加密前必须要先安装好LuaJIT。其实我们在安装Quick的时候就可以把LuaJIT安装好。我们跳转到Quick引擎的根目录下面,执行setup_mac.sh。会出现下面的界面:

输入Y就可以安装,安装完成后我们就可以对脚本进行加密。

切换到Quick里自己的工程目录,比如我们原来建立的Brave工程。在目录下打开终端,输入

1
compile_scripts.sh -i scripts -o game.zip

这样在该目录下会生成一个名字叫做game.zip的压缩文件。我们把script文件从工程里移除掉,把game.zip拷到res文件夹下,然后打开AppDelegate.cpp文件,在

1
pStack->loadChunksFromZIP( "res/framework_precompiled.zip" );

增加这么一句:

1
pStack->loadChunksFromZIP( "res/game.zip" );

添加完成后,我们需要将代码调用的入口进行修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
size_t pos;
while ((pos = path.find_first_of( "\\" )) != std::string::npos)
{
path.replace(pos,1, "/" );
}
size_t p = path.find_last_of( "/\\" );
if (p != path.npos)
{
const string dir = path.substr(0,p);
pStack->addSearchPath(dir.c_str());
p = dir.find_last_of( "/\\" );
if (p != dir.npos)
{
pStack->addSearchPath(dir.substr(0,p).c_str());
}
}
string env = "__LUA_STARTUP_FILE__=\"" ;
env.append(path);
env.append( "\"" );
pEngine->executeString( "require 'main'" );
CCLOG( "------------------------------------------------" );
CCLOG( "LOAD LUA FILE: %s" ,path.c_str());
CCLOG( "------------------------------------------------" );
pEngine->executeScriptFile(path.c_str());

注释掉,添加

1
pStack->executeString( "require 'main'" );

这样的话我们就可以直接调用加密过后的文件。但需要注意的是,前面的加密方式只是把Lua编译成了二进制的文件,并没有对他进行加密处理。有时候我们需要更高的安全性。这时候要怎么做呢?

我们在终端中输入

1
compile_scripts.sh -h

显示很多我们需要的选项:

接下来我们来说下compile_scripts.sh参数的意义,详情如下:

  1. -h 显示当前帮助

  2. -i 源码目录

  3. -o 输出文件或目录

  4. -p 包前缀

  5. -x 不包含在内的包 。如果你有些源文件不想被编译进去的话,将会用到这个参数,只能设置包(对应文件夹),不能指定到文件,多个包的话用,(逗号)隔开。示例:-x app.test,server,指的是app/test/.*,server/.* 这两个目录下的所有文件都不会被编译

    编译模式

  6. -m zip 默认,生成的是zip格式文件

  7. -m files 生成的是一个个文件,不打包,这个时候-o参数指的就是输出的目录

    加密模式,可以对编译后的文件再进行 XXTEA 加密

  8. -e xxtea_zip 对应-m zip,对打包后的zip格式文件进行加密,之后再打包成zip格式

  9. -e xxtea_chunk 对编译后的文件加密,最后是否打包取决于-m

    注:xxtea_zip一定要与-m zip编译模式对应,不然会提示出错

  10. -ek 加密密钥。如果有-e参数后,必须要有密钥

  11. -es 加密签名。可选参数,默认值为" XXTEA ",为了让引擎知道是否文件已经加密。

  12. -ex 编译后的文件的后缀名 。-m files时有效,默认值为" lua "

  13. -c 从一个文件加载参数列表

  14. -q 生成过程不输出信息

我们同样以当前的Brave游戏为例,我们在上面的加密中并没有给包通过密钥来加密。接下来我们用密钥“12345678” 来给它加密试试。输入如下命令:

1
compile_scripts.sh -i scripts -o res/game.zip -e xxtea_zip -ek 12345678

然后我们再修改下AppDelegate.cpp文件,在

1
pStack->loadChunksFromZIP( "res/framework_precompiled.zip" );

之前添加

1
2
3
4
// 如果设置了 -e 和 -ek 要加上下面这句
pStack->setXXTEAKeyAndSign( "12345678" ,8, "XXTEA" ,5);
// 如果设置了 -e 和 -ek -es 则要加上下面这句
//pStack->setXXTEAKeyAndSign("aaa",3,"XT",2);

将应用重新打包后到手机上运行,是不是万事OK了呢!

资源加密

我们上面介绍的另外一个加密脚本pack_files.sh就是用来加密。首先,我们还是来看下pack_files.sh的使用帮助。在命令行输入:

1
pack_files.sh -h

显示下图所示的帮助信息:

从上面的帮助信息可以看出,对资源的加密有几种方式,既可以只对文件进行加密,也可以直接将文件打包成zip包,还可以压缩成zip包,并对zip包进行加密。如果是压缩成zip包后对zip包进行加密,我们就需要在AppDelegate.cpp中添加

1
pStack->loadChunksFromZIP( "res/压缩文件.zip" );

我们先将image文件夹拷出来,然后再执行这里只讲解下对文件加密的过程:

1
pack_files.sh -i ../image -o image -ek 12345678

完成后打包运行就OK了!

猜你在找的Cocos2d-x相关文章