Cocos2d-lua 3.10 圖片資源加密
阿新 • • 發佈:2019-02-12
在遊戲釋出之前,最好將圖片加密,為apk/ipa加一層保護(雖然可能沒用),涉及兩個問題:
1. 如何對圖片加密
2. 如何讀取加密後的圖片
下面詳細說明。
對圖片加密
Quick-3.3提供了pack_files.sh
可以實現對圖片加密,基本原理就是對每個圖片使用xxtea
加密演算法對圖片二進位制資料進行加密,我們只需要提供金鑰key和簽名sign即可。具體用法如下:
# encrypt images
./pack_files.sh -i path/to/image -o output/dir -m files -ek encrypt_key_sample -es encrypt_sign_sample
各個引數的意義
引數 | 含義 |
---|---|
-i | 待加密的圖片所在目錄 |
-o | 加密後的圖片輸出目錄 |
-m | files,輸出為單個加密後的檔案 |
-ek | 指定加密金鑰 |
-es | 指定加密簽名 |
如果執行正常,輸出類似:
Pack source files in path path/to/img
create output files in output/dir .
done.
讀取加密後的圖片
暫時沒有想到更好的辦法,只好修改了CCImage.cpp
的原始檔去判斷圖片是否加密,如果加密了,首先對其解密,再生成CCImage
物件。
// CCImage.cpp
// 首先包含xxtea的標頭檔案,xxtea在cocos2dx已包含,無需單獨提供,只需要正確引入即可
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "xxtea.h"
#else
#include "external/xxtea/xxtea.h"
#endif
// 主要修改initWithImageData這個函式
bool Image::initWithImageData(const unsigned char * data, ssize_t dataLen)
{
bool ret = false ;
do
{
CC_BREAK_IF(! data || dataLen <= 0);
unsigned char* unpackedData = nullptr;
ssize_t unpackedLen = 0;
//detect and unzip the compress file
if (ZipUtils::isCCZBuffer(data, dataLen))
{
unpackedLen = ZipUtils::inflateCCZBuffer(data, dataLen, &unpackedData);
}
else if (ZipUtils::isGZipBuffer(data, dataLen))
{
unpackedLen = ZipUtils::inflateMemory(const_cast<unsigned char*>(data), dataLen, &unpackedData);
}
else
{
// 註釋掉這個分支其餘程式碼,如果圖片資料data為加密的,必須首先解密才可正常使用
// unpackedData = const_cast<unsigned char*>(data);
// unpackedLen = dataLen;
// 加密key
const unsigned char* key = "encrypt_key_sample";
int key_len = 18;
// 加密sign
const unsigned char* sign = "encrypt_sign_sample";
int sign_len = 19;
xxtea_long len = 0;
// 如果加密的資料最開始幾個位元組如果與簽名相符,則是加密的資料
if (strncmp((const char*)data, sign, sign_len == 0) {
unpackedData = xxtea_decrypt((unsigned char*)data + sign_len,
(xxtea_long)dataLen - sign_len,
key,
(xxtea_long)key_len,
&len);
unpackedLen = len;
}
else {
unpackedData = const_cast<unsigned char*>(data);
unpackedLen = dataLen;
}
... // 後面程式碼無需更改
}
}
這樣就可以了。