1. 程式人生 > >Cocos2d-x教程(32)-quick-cocos2d-x 加密

Cocos2d-x教程(32)-quick-cocos2d-x 加密

歡迎加入Cocos2d-x 交流群:193411763

轉載時請註明原文出處 :http://blog.csdn.net/u012945598/article/details/38870705

開發環境:Xcode 5.0 + quick-cocos2d-x-2.2.5

如果開發者不想讓遊戲中的資源或指令碼檔案輕易的暴露給其他人,一般會採用對檔案進行加密的方式來保護檔案或資源被盜用。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 -iscripts -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包,還需對其進行解壓。最後打包時在專案中的資源或指令碼僅保留.zip即可,原本的資源及指令碼直接刪除其引用即可,不要直接把檔案丟進垃圾桶。

還有一點需要說明的是,該方法並非只能對quick-x中的資源加密,比如,如果開發者使用的是cocos2d-x 2.2.5的版本,但是卻希望使用quick-x中的加密方法對資源及指令碼進行加密,這樣也是可以的。加密的步驟與上述相同,但由於cocos2d-x 2.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 2.2.5中也可以使用該加密方法了。