zoukankan      html  css  js  c++  java
  • cocos进阶教程(3)Lua加密技术

    如果开发者不想让游戏中的资源或脚本文件轻易的暴露给其他人,一般会采用对文件进行加密的方式来保护文件或资源被盗用。Quick-Cocos2d-x 为开发者提供了xxtea加密算法,用来对脚本文件及资源进行加密,加密对象大体分为如下几种:

    1. 对脚本/资源文件本身加密

    2. 将脚本/资源文件压缩成zip,对zip进行加密

    3. 对脚本/资源文件加密后,再将其压缩后的zip再次加密

    首先来演示对脚本文件的加密

    1. 创建一个新工程,名为quicktest。

    通过控制台进入到该工程目录下,例:

    cd /Users/Helloworld/Desktop/quick-cocos2d-x-2.2.5/bin/quicktest

    2. 执行 compile_scripts.sh脚本(位于quick-cocos2d-x-2.2.5/bin文件夹下。windows下执行.bat),执行时需要输入若干个参数,这里简单介绍一下各个参数的功能(也可以直接查看对应的php脚本文件或输入-h查看帮助):

    • -h 帮助

    • -i  源文件目录

    • -o 输出文件目录/输出文件名

    • -p 包前缀名字

    • -x  不包含的包,即当前目录下的哪些包不希望被添加进去

    • -m 编译模式,包含两种,一种是默认的打包成zip,另外一种是不打包直接生成一个个的文件

    • -e 加密模式,包含两种,xxtea_chunk是对文件本身进行加密,xxtea_zip是对打包后的zip进行加密

    • -ek 加密秘钥

    • -es 加密签名

    • -ex 加密文件的后缀名,默认是lua

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

    • -q 生成过程不输出信息

    例:

    /Users/Helloworld/Desktop/quick-cocos2d-x-2.2.5/bin/compile_scripts.sh -i scripts -o res/game.zip -e xxtea_zip -ek MYKEY -es XT

    上面这段代码的作用,是将 scripts 文件夹中的脚本文件压缩,并存放到res目录下,压缩后的文件名为game.zip,加密方式采用的是对zip压缩包进行加密,如果采用文本方式加密则-e 后应该写 xxtea_chunks。秘钥和签名将会在代码中使用。操作完整截图如下:

    下面打开quick-cocos2d-x/bin/quicktest/res ,可以看到里面有两个压缩包,其中framework_precompiled.zip是引擎自带的,而另外一个则是我们刚刚生成的,双击game.zip之后你会发现解压出来的是一个game.zip.cpgz的文件,然后双击这个.cpgz的文件之后又会生成game.zip文件,原因是这个zip已经被加密,所以无法识别了。如果这里采用的是脚本加密的方式或不加密的方式则可以正常解压。

    之后在引擎中使用加密后的脚本文件时,只需将AppDelegate.cpp中原本执行脚本文件的那段代码替换为如下代码:

    pStack->setXXTEAKeyAndSign("MYKEY", 5, "XT", 2);
    pStack->loadChunksFromZIP("res/game.zip");
    pStack->executeString("require 'main'");

    其中第一行代码中的5和2代表的是字符串"MYKEY"和"XT"的字符个数为5和2。

    脚本加密的方式大体如上文所述,至于资源加密的方法与脚本加密类似,在进入quicktest目录下之后执行pack_files.sh脚本(win执行pack_files.bat)。输入-h查看帮助

    第一个样例,是将res中的资源文件进行加密,加密后的文件存放到resnew文件夹中;第二个是讲res中的资源打包成zip存放到game.zip,并未加密;第三个是存放到zip中后并对zip进行加密。还有另外一种方式就是两种方法结合使用,将资源加密后存放到某一文件夹,之后再重新执行一次脚本将这些加密后的文件打包成zip再加密。

    之后还需要在AppDelegate.cpp中加一段代码:

    pStack->setXXTEAKeyAndSign("XXTEA", 5,"tsts",4);

    如果将资源压缩成了zip包,还需再加一行代码:

    pStack->loadChunksFromZip("picture.zip");

    如此便可以成功运行了,打包时在项目的资源中仅保留.zip即可,原本的资源及脚本直接删除其引用即可,源文件千万不要删掉。

    还有一点需要说明的是,该方法并非只能对Quick-x中的资源加密,比如,如果开发者使用的是Cocos2d-x 2.2.5的版本,但是却希望使用Quick-x中的加密方法对资源及脚本进行加密,这样也是可以的。加密的步骤与上述相同,但由于Cocos2d-x v2.2.5并没有相关的解密算法,所以需要修改若干文件方可正常使用,笔者修改后已测试成功,这里简单描述需要修改的内容。

    Quick-x 脚本及资源加解密方法修改文件(具体修改的地方对比一下就知道了)

    一、资源解密修改

    1.修改cocos2dx/platform/ios/CCImage.mm文件

    2.增加文件 apptools 到 extensions 文件夹

    3.给cocos2dx.xcodeproj添加header search path  : "$(SRCROOT)/../../extensions"

    (注:这里笔者将apptools添加到了extensions文件夹只是为了方便,其实添加到其它位置也并非不可以。这里面涉及到了一点问题,因为cocos2dx的库文件位于cocos2dx.xcodeproj工程中,而lua库位于另外一个工程,但这一点在quick-x中不一样,在quick-x中这两个库文件都位于同一个工程,所以它们之间引用不存在问题,但是在cocos2d-x 2.2.5中便存在了不同工程间的文件引用问题,所以笔者此处做了2,3步的修改)。

    二、脚本解密修改

    1.修改lua/cocos2dx_support/CCLuaStack.h  .cpp 文件

    2.增加 xxtea文件 目录 cocos2dx/support/xxtea.h  xxtea.c  

    3.增加 CCZipFile.h .cpp文件 目录 cocos2dx/platform/CCZipFile.h  .cpp  

    4.修改 unzip.h .cpp文件 目录cocos2dx/support/zip_support/unzip.h  .cpp 

    5.增加 loapi_mem.h .cpp文件 目录 cocos2dx/support/zip_support/loapi_mem.h .cpp 

    修改成功后,在Cocos2d-x v2.2.5中也可以使用该加密方法了。

  • 相关阅读:
    leetcode Remove Linked List Elements
    leetcode Word Pattern
    leetcode Isomorphic Strings
    leetcode Valid Parentheses
    leetcode Remove Nth Node From End of List
    leetcode Contains Duplicate II
    leetcode Rectangle Area
    leetcode Length of Last Word
    leetcode Valid Sudoku
    leetcode Reverse Bits
  • 原文地址:https://www.cnblogs.com/damowang/p/4940084.html
Copyright © 2011-2022 走看看