Cocos2d-x图片资源加密
http://cn.cocos2d-x.org/tutorial/show?id=2739
图片加密使用xxtea来加密,加密秘钥自己定,思路就是自己使用代码首先将图片加密,在程序中使用的时候,在加载图片资源处再将资源解密。
加密代码如下:
1、首先要加载头文件
2、将图片加密
bool jiamiImg(string inputFileName,string outFileName) { string fileName=FileUtils::getInstance()->fullPathForFilename(inputFileName); if(fileName.empty()) { return false; } Data fileData=FileUtils::getInstance()->getDataFromFile(fileName); xxtea_long ret_len; unsigned char key[100]="lyctianya"; unsigned char* ret_data= xxtea_encrypt(fileData.getBytes(), (xxtea_long)fileData.getSize(),key, (xxtea_long)strlen("lyctianya"), &ret_len); if (ret_data==NULL) { return false; } FILE*fp=fopen(outFileName.c_str(), "wb+"); if (fp==NULL) { return false; } fwrite(ret_data, ret_len, 1, fp); fflush(fp); fclose(fp); CC_SAFE_DELETE(ret_data); return true; }
3、加密部分
/*************jiami************/ /* std::string outFileName="/Users/liyongchuang/Desktop/cocosTool/code/myLuaTest/res/jiamiStar.png"; bool jiamiRet=jiamiImg("Star.png",outFileName.c_str()); if (jiamiRet) { printf("-----success-----\n"); } else { printf("------false------\n"); } */
4、加密后生成的文件
5、修改加载图片资源处,并使用解密
修改
加入并修改如下代码:头文件自己加
bool isEndWith(std::string inputStr,std::string endStr) { if (inputStr.empty()||endStr.empty()) { return false; } std::string newEndStr = inputStr.substr(inputStr.find_last_of(".")); if (endStr.compare(newEndStr) == 0) { return true; } else { return false; } } bool Image::initWithImageFile(const std::string& path) { bool ret = false; _filePath = FileUtils::getInstance()->fullPathForFilename(path); #ifdef EMSCRIPTEN // Emscripten includes a re-implementation of SDL that uses HTML5 canvas // operations underneath. Consequently, loading images via IMG_Load (an SDL // API) will be a lot faster than running libpng et al as compiled with // Emscripten. SDL_Surface *iSurf = IMG_Load(fullPath.c_str()); int size = 4 * (iSurf->w * iSurf->h); ret = initWithRawData((const unsigned char*)iSurf->pixels, size, iSurf->w, iSurf->h, 8, true); unsigned int *tmp = (unsigned int *)_data; int nrPixels = iSurf->w * iSurf->h; for(int i = 0; i < nrPixels; i++) { unsigned char *p = _data + i * 4; tmp[i] = CC_RGB_PREMULTIPLY_ALPHA( p[0], p[1], p[2], p[3] ); } SDL_FreeSurface(iSurf); #else Data data; if (isEndWith(_filePath, ".lyc")) { Data fileData=FileUtils::getInstance()->getDataFromFile(_filePath); xxtea_long ret_len; unsigned char key[100]="lyctianya"; unsigned char*ret_data=xxtea_decrypt(fileData.getBytes(), (xxtea_long)fileData.getSize(), key, strlen("lyctianya"), &ret_len); data.fastSet(ret_data, ret_len); } else { data = FileUtils::getInstance()->getDataFromFile(_filePath); } if (!data.isNull()) { ret = initWithImageData(data.getBytes(), data.getSize()); } #endif // EMSCRIPTEN return ret; } bool Image::initWithImageFileThreadSafe(const std::string& fullpath) { bool ret = false; _filePath = fullpath; Data data; if (isEndWith(_filePath, ".lyc")) { Data fileData=FileUtils::getInstance()->getDataFromFile(_filePath); xxtea_long ret_len; unsigned char key[100]="lyctianya"; unsigned char*ret_data=xxtea_decrypt(fileData.getBytes(), (xxtea_long)fileData.getSize(), key, strlen("lyctianya"), &ret_len); data.fastSet(ret_data, ret_len); } else { data = FileUtils::getInstance()->getDataFromFile(_filePath); } if (!data.isNull()) { ret = initWithImageData(data.getBytes(), data.getSize()); } return ret; }
顺便附上单独解密代码:
bool jiemiImg(string jiaMiFileName,string outFileName) { string fileName=FileUtils::getInstance()->fullPathForFilename(jiaMiFileName); if (fileName.empty()) { return false; } Data fileData=FileUtils::getInstance()->getDataFromFile(fileName); xxtea_long ret_len; unsigned char key[100]="lyctianya"; unsigned char*ret_data=xxtea_decrypt(fileData.getBytes(),(xxtea_long)fileData.getSize(), key, strlen("lyctianya"), &ret_len); if (ret_data==NULL) { return false; } FILE*fp=fopen(outFileName.c_str(),"wb+"); if (fp==NULL) { return false; } fwrite(ret_data, ret_len, 1, fp); fflush(fp); fclose(fp); CC_SAFE_DELETE(ret_data); return true; }
/*************jiemi************/ /* std::string outFileName="/Users/liyongchuang/Desktop/cocosTool/code/myLuaTest/res/jiemiStar.png"; bool jiaemiRet=jiemiImg("jiamiStar.png",outFileName.c_str()); if (jiaemiRet) { printf("-----success-----\n"); } else { printf("------false------\n"); } */
修改lua中的代码,并使用资源:
local function main() local gameScene=cc.Scene:create() local ly=cc.LayerColor:create(cc.c4b(0,255,255,255)) gameScene:addChild(ly) local lb=cc.Label:createWithSystemFont("Hello world","Arial",20) ly:addChild(lb) lb:setPosition(480,320) local sp=cc.Sprite:create("res/jiamiStar.lyc") ly:addChild(sp, 10) sp:setPosition(cc.p(480,280)) if cc.Director:getInstance():getRunningScene() then cc.Director:getInstance():replaceScene(gameScene) else cc.Director:getInstance():runWithScene(gameScene) end end
下面看结果:
顺便提一下,大家有没有发现一个问题,我的一些资源用了没有释放哦!
unsigned char *zipFileData =FileUtils::getInstance()->getFileData(zipFilePath.c_str(), "rb", &size); free(zipFileData);