Cocos2d-x客戶端資源加密

你的財神爺發表於2018-01-09

安卓打包的apk檔案只是做了簡單的壓縮,通過解壓縮可以獲取資原始檔,如果不想圖片資源被別人看到,那麼可以對圖片進行加密。

cocos2d-x提供了xxtea加密和解密演算法,先將圖片進行加密,這樣就打不開圖片了,然後在CCImage解析圖片的時候進行解密即可。


一、下載quick-cocos2d-x

quick-cocos2d-x封裝了一套加密的工具,先下載quick-cocos2d-x,git地址https://github.com/dualface/v3quick

解壓之後把bin目錄拷貝到我們的cocos2d-x工程根目錄。



二、加密

quick-cocos2d-x提供了pack_files命令,可以將圖片進行加密,加密演算法用的是xxtea,你可以到cocos2d-x\external\xxtea目錄下檢視。

到bin目錄開啟命令列視窗,執行pack_files.bat -h 可以檢視pack_files的使用方法。



編寫打包資源指令碼

[plain] view plain copy
  1. ::res_pack.bat  
  2.   
  3. set DSRC=E:\Cocos2d\Cocos2d-x\Projects\Game_Lua\res  
  4. set ESRC=E:\Cocos2d\Cocos2d-x\Projects\Game_Lua\assets  
  5.   
  6. cd bin  
  7.   
  8. pack_files.bat -i %DSRC% -o %ESRC% -ek 123456 -es test  


加密後的圖片檔案:


開啟遊戲則會報錯,unsupport image format,因為每種圖片的前面一些位元組是這種圖片型別的標記,比如png的前面8個位元組固定是0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a。因為已經被加密了,所以識別不了圖片格式。



二、解密

所有圖片的載入都封裝在CCImage類的initWithImageFile和initWithImageFileThreadSafe方法。

[cpp] view plain copy
  1. // initWithImageFile  
  2.     Data data = FileUtils::getInstance()->getDataFromFile(_filePath);  
  3.   
  4.     if (!data.isNull())  
  5.     {  
  6.         ret = initWithImageData(data.getBytes(), data.getSize());  
  7.     }  

封裝一個解密方法,引數是Data型別的,然後再用解密後的資料去載入圖片。

[cpp] view plain copy
  1. void Image::image_decrypt(Data *data)  
  2. {  
  3.     const char* key = "123456";  
  4.     const char* sign = "test";  
  5.     unsigned char* dataBytes = data->getBytes();  
  6.     ssize_t dataLen = data->getSize();  
  7.     ssize_t signLen = strlen(sign);  
  8.     ssize_t keyLen = strlen(key);  
  9.   
  10.     if (strncmp(sign, (const char*)dataBytes, signLen) != 0)  
  11.     {  
  12.         return;  
  13.     }  
  14.     xxtea_long retLen = 0;  
  15.     unsigned char* retData = xxtea_decrypt(dataBytes+signLen, dataLen-signLen, (unsigned char*)key, keyLen, &retLen);  
  16.     data->fastSet(retData, retLen);  
  17. }  


分別在initWithImageFile和initWithImageFileThreadSafe方法中呼叫。


相關文章