1. 程式人生 > >cocos2dx使用xxtea加密資源

cocos2dx使用xxtea加密資源

記錄在cocos2dx下使用xxtea加密,以下都為ios版本操作

1.資源加密

quick有一個加密資源和指令碼的解決方案,即使用xxtea加密並且可以進行打包,在pack_files資料夾下有一個pack_files.sh本人使用的mac,中windows中使用.bat

指令碼命令的詳細講解,在這裡只是使用了對資源進行加密,不進行打包。指令碼命令如下

  1. ./pack_files.sh -i ./res -o ./resnew -ek key -es sign  
1.資源讀取

解密涉及到對cocos2dx引擎的一些改動,所以寫了個ResourcesDecode類,cocos2dx本身含有xxtea類檔案,把這2個

類檔案放入到專案cocos2d/cocos/platform下,在cocos2d.h資料夾中加入2個類的引用,在cocos2d/build目錄下把2個類加入到ios的靜態類庫中,在AppDelegate.cpp場景切換之前加入

  1. ResourcesDecode::getInstance()->setXXTEAKeyAndSign("key""sign");  
具體的方法會在ResourcesDecode中介紹,會上傳檔案。

修改image.h中Image::initWithImageFile方法中做如下更改

  1. Data data = ResourcesDecode::getInstance()->decodeData(path.c_str());  
ios平臺檔案中的apple/CCFileUtils中修改FileUtilsApple::getValueMapFromFile中做如下更改
  1. Data data = ResourcesDecode::getInstance()->decodeData(fullPath.c_str());  
  2. ssize_t bufferSize = data.getSize();  
  3. unsigned char* pFileData = data.getBytes();  
  4. NSData *nsdata = [[[NSData alloc] initWithBytes:pFileData length:bufferSize] autorelease];  
  5. NSPropertyListFormat format;  
  6. NSString *error;  
  7. NSMutableDictionary *dict = (NSMutableDictionary *)[  
  8.                                                     NSPropertyListSerialization propertyListFromData:nsdata  
  9.                                                     mutabilityOption:NSPropertyListMutableContainersAndLeaves  
  10.                                                     format:&format  
  11.                                                     errorDescription:&error];  
  12. //over

讀取json檔案還需在FileUtils::getStringFromFile中做如下更改

  1. Data data = ResourcesDecode::getInstance()->decodeData(path.c_str());  
讀取tilemap檔案在SAXParser::parse下做如下更改
  1. Data data = ResourcesDecode::getInstance()->decodeData(path.c_str());  

上面的decodeData到底做了什麼操作呢,其實就是讀取到資源再對它解密操作

  1. Data ResourcesDecode::decodeData(constchar *fileName)  
  2. {  
  3.     Data ret;  
  4.     ssize_t dsize = 0;  
  5.     unsigned char* dresult;  
  6.     unsigned char* buffer = nullptr;  
  7.     size_t size = 0;  
  8.     size_t readsize;  
  9.     auto fileutils = FileUtils::getInstance();  
  10.     do
  11.     {  
  12.         // Read the file from hardware
  13.         std::string fullPath = fileutils->fullPathForFilename(fileName);  
  14.         FILE *fp = fopen(fullPath.c_str(), "rb");  
  15.         CC_BREAK_IF(!fp);  
  16.         fseek(fp,0,SEEK_END);  
  17.         size = ftell(fp);  
  18.         fseek(fp,0,SEEK_SET);  
  19.         buffer = (unsigned char*)malloc(sizeof(unsigned char) * size);  
  20.         readsize = fread(buffer, sizeof(unsigned char), size, fp);  
  21.         fclose(fp);  
  22.     } while (0);  
  23.     if (nullptr == buffer || 0 == readsize)  
  24.     {  
  25.         CCLOG("Get data from file %s failed", fileName);  
  26.     }  
  27.     if (_xxteaEnabled && strncmp((char*)buffer, _xxteaSign, _xxteaSignLen) == 0)  
  28.     {  
  29.         // decrypt XXTEA
  30.         xxtea_long len = 0;  
  31.         dresult = xxtea_decrypt(buffer + _xxteaSignLen,  
  32.                                 (xxtea_long)readsize - _xxteaSignLen,  
  33.                                 (unsigned char*)_xxteaKey,  
  34.                                 (xxtea_long)_xxteaKeyLen,  
  35.                                 &len);  
  36.         dsize = len;  
  37.         ret.fastSet(dresult, dsize);  
  38.     }  
  39.     if (buffer) {  
  40.         free(buffer);  
  41.     }  
  42.     return ret;  
  43. }  

可以參考FileUtils::getFileData中的處理。