cocos2dx 图片资源加密

图片加密使用xxtea来加密,加密秘钥自己定,思路就是自己使用代码首先将图片加密,在程序中使用的时候,在加载图片资源处再将资源解密

加密代码如下:

首先要加载头文件

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);

时间: 2024-08-25 13:15:47

cocos2dx 图片资源加密的相关文章

Cocos2d-x图片资源加密

http://cn.cocos2d-x.org/tutorial/show?id=2739 图片加密使用xxtea来加密,加密秘钥自己定,思路就是自己使用代码首先将图片加密,在程序中使用的时候,在加载图片资源处再将资源解密. 加密代码如下: 1.首先要加载头文件 2.将图片加密 bool jiamiImg(string inputFileName,string outFileName)   {       string fileName=FileUtils::getInstance()->ful

cocos2d-x 图片资源加密,Lua文件加密 (转)

游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePacker工具来加密的,不过针对性还是不够强. 分析一下原理为: 1,转格式:将需要加密的文件转为流的方式: 2,加密:根据自己需要使用加密手段,MD5,AES,甚至可以直接改变位移,加一些自己的特殊字符也可以使文件简单加密,加密完后基本保证 图片类型基本用特殊软件预览不了也打不开,Lua文件加密后一片乱

【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】

游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePacker工具来加密的,不过针对性还是不够强. 分析一下原理为: 1,转格式:将需要加密的文件转为流的方式: 2,加密:根据自己需要使用加密手段,MD5,AES,甚至可以直接改变位移,加一些自己的特殊字符也可以使文件简单加密,加密完后基本保证 图片类型基本用特殊软件预览不了也打不开,Lua文件加密后一片乱

(转)quick-cocos2d-x图片资源加密

摘要: 在quick-cocos2d-x上实现的一种图片资源加密的方法,现已经加入官方最新版本之中 ###quick-x已经支持用XXTEA加密方式对脚本文件进行加密.在此基础上,自己做了一些工作,对图片资源进行了XXTEA加密,现分享给大家. ###(2014.5.30加注:quick-x的2.2.3版本已经集成了我递交的pr,现在官方版本代码与文章中类似) ###首先我们要有对图片加密的工具.这个参考compile_scripts脚本,写一个用于加密的脚本就可以了.我自己写的脚本放在这里,大

(转)quick-cocos2d-x图片资源加密(续)

摘要: 对在quick-cocos2d-x上实现的资源加密方法的补充 前篇: quick-cocos2d-x图片资源加密 让quick-cocos2d-x支持加密的plist文件 通过前篇的修改,我们已经能够在Windows平台的player,以及Android上使用加密的常见格式(png.jpg等)的图片资源了.不过,在MAC上的player,以及IOS上,加载资源时调用的是另外的代码,所以我们需要另外作修改. 首先来修改Mac上的Player代码.我们这次要修改的是lib\cocos2d-x

cocos2d-x PNG图片资源加密

实现原理 如果你对实现原理并不感兴趣,只是想直接使用的话可以跳过这节.首先我假设读者已经清楚PNG图像文件结构了,如果没有的话这里建议可以看看<揭秘数据解密的关键技术>第5章,这章里面专门对PNG图像格式进行了介绍.或者看看<PNG文件格式详解>这篇文章. 实现原理很简单,只是将PNG文件的文件头和每个数据块的名称给去掉,特殊的数据块(如IHDR和IEND)连数据块内容也一并给去掉.在这之后,已经找不到PNG的特征信息了.但是要怎么解密呢?我将去掉的那些信息按照一定格式保存起来,然

Cocos2d-x 资源加密解密总结

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee 本文针对的是cocos2d-x 3.4 版本进行研究. 做加密解密的思路 加密解密算法的简单介绍 首先,加密解密应该是一个单独的话题,一般不会涉及具体使用的引擎.框架和技术. 加密算法有Base64,DES等. Base64的原理类似于凯撒密码,啥是凯撒密码呢,就是一个字符用另一个字符来代替. 比如:a用i代替,b用k代替,以此类推.加密和解密的过程就是一个互相映射的过程. DES是

cocos2d-x lua 加密

usage: cocos luacompile [-h] [-v] [-s SRC_DIR_ARR] [-d DST_DIR] [-e] [-k ENCRYPTKEY] [-b ENCRYPTSIGN] [--disable-compile] 对 lua 文件进行加密和编译为字节码的处理. optional arguments: -h, --help            show this help message and exit -v, --verbose         更多输出信息.

Cocos2d-x 游戏资源(图片、XML、TXT等)打包加密 之 解密读取

自上一篇  Unity3d 游戏资源打包加密(图片/XML/TXT等) C#编码 (一)   介绍如何打包加密游戏资源已经好几月,却没有详细说明如何在游戏中去读取加密的资源,虽然聪明的程序员看一眼就知道如何逆向编码,但是还是详细说明一下,以作完结. 转自陈里陈外的博客 http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn Cocos2d-X 资源加密与解密 加密只有一篇即可,解密分为两篇,Cocos2d-x 篇 和 Unity3