###quick-x已經支持用XXTEA加密方式對腳本文件進行加密。在此基礎上,本身作了一些工做,對圖片資源進行了XXTEA加密,現分享給你們。 ###(2014.5.30加註:quick-x的2.2.3版本已經集成了我遞交的pr,如今官方版本代碼與文章中相似)php
###首先咱們要有對圖片加密的工具。這個參考compile_scripts腳本,寫一個用於加密的腳本就能夠了。我本身寫的腳本放在這裏,你們能夠下載使用。(以前沒用過php,徹底是照着廖大的腳本修改爲的,有寫得很差的地方還請多多包涵,呵呵)git
###腳本使用的方法和compile_scripts腳本差很少,將zip包裏的文件解壓到quick-x的bin目錄下就能夠用了。安全
###在Windows命令行下,輸入如下指令(請確認環境變量PATH裏有quick-x的bin目錄,不然須要本身加運行路徑)app
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文件,請看「後篇」裏的內容)ui
###文件加密好之後,咱們須要修改quick-x的平臺代碼,使得它可以讀取加密後的文件。加密
###載入圖片的函數是lib\cocos2d-x\cocos2dx\platform\CCImageCommon_cpp.h裏面的CCImage::initWithImageFile()和CCImage::initWithImageFileThreadSafe()。再進一步看,這兩個函數裏都是使用CCFileUtils::sharedFileUtils()->getFileData()來得到文件數據的,咱們只須要在獲取數據時把文件數據解密便可。lua
###爲此咱們須要專門寫一個新的getFileData()來代替調用。直接寫一個是能夠的,放在哪一個文件裏也不重要。由於我本身有一個HelperFunc模塊,專門放本身增長的功能的,因此我就寫在這裏面了。文件裏的相關代碼以下:.net
HelperFunc.h
#ifndef Cocos2Dx_HelperFunc_h #define Cocos2Dx_HelperFunc_h NS_CC_BEGIN class CZHelperFunc { public: static unsigned char* getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize); }; NS_CC_END #endif //Cocos2Dx_HelperFunc_h
HelperFunc.cpp
#include "cocos2d.h" extern "C" { #include "lua.h" #include "xxtea.h" } #include "CCLuaEngine.h" #include "HelperFunc.h" USING_NS_CC; unsigned char* CZHelperFunc::getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize) { unsigned long size; unsigned char* buf = CCFileUtils::sharedFileUtils()->getFileData(pszFileName, pszMode, &size); if (NULL==buf) return NULL; CCLuaStack* stack = CCLuaEngine::defaultEngine()->getLuaStack(); unsigned char* buffer = NULL; bool isXXTEA = stack && stack->m_xxteaEnabled; for (unsigned int i = 0; isXXTEA && i < stack->m_xxteaSignLen && i < size; ++i) { isXXTEA = buf[i] == stack->m_xxteaSign[i]; } if (isXXTEA) { // decrypt XXTEA xxtea_long len = 0; buffer = xxtea_decrypt(buf + stack->m_xxteaSignLen, (xxtea_long)size - (xxtea_long)stack->m_xxteaSignLen, (unsigned char*)stack->m_xxteaKey, (xxtea_long)stack->m_xxteaKeyLen, &len); delete []buf; buf = NULL; size = len; } else { buffer = buf; } if (pSize) *pSize = size; return buffer; }
###由於上面代碼裏直接使用了CCLuaStack裏的密匙等數據,因此要修改一下lib\cocos2d-x\scripting\lua\cocos2dx_support\CCLuaStack.h,把裏面的幾個屬性改爲公有的才能調用。固然我這是偷懶了,安全的作法應該是加幾個取值的方法,呵呵。
public: bool m_xxteaEnabled; char *m_xxteaKey; int m_xxteaKeyLen; char *m_xxteaSign; int m_xxteaSignLen;
###另外,咱們須要在程序啓動時設置一下密匙和標記,這就要修改AppDelegate.cpp裏的AppDelegate::applicationDidFinishLaunching(),在下面這句:
CCLuaStack *pStack = pEngine->getLuaStack();
###這句後面加上:
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平臺,其餘的修改請看續篇。