如果開發者不想讓游戲中的資源或腳本文件輕易的暴露給其他人,一般會采用對文件進行加密的方式來保護文件或資源被盜用。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中也可以使用該加密方法了。