zoukankan      html  css  js  c++  java
  • Cocos2d-x图片资源加密

    http://cn.cocos2d-x.org/tutorial/show?id=2739

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

    加密代码如下:

    1、首先要加载头文件

    20150420115250269.jpg

    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-----
    "); 
    } 
    else 
    { 
        printf("------false------
    "); 
    } 
     */

    4、加密后生成的文件

    20150420115804304.jpg

    5、修改加载图片资源处,并使用解密

    修改

    1429512504373337.png

    加入并修改如下代码:头文件自己加

    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-----
    "); 
         } 
     else 
     { 
         printf("------false------
    "); 
     } 
    */

    修改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

    下面看结果:

    20150420124101219.jpg

    顺便提一下,大家有没有发现一个问题,我的一些资源用了没有释放哦!

    unsigned char *zipFileData =FileUtils::getInstance()->getFileData(zipFilePath.c_str(), "rb", &size);
    free(zipFileData);
  • 相关阅读:
    quartz 时间表达式----- Cron表达式详解
    js正则表达式
    tomcat的server.xml文件的详解
    spring web.xml中 过滤器(Filter)的工作原理和代码演示
    tomcat端口占用解决方案
    Spring集成Hibernate映射文件的4种方式
    Hibernate 一二级缓存的使用场景
    Hibernate各种主键生成策略
    Pip的安装,环境变量的配置以及使用方法
    解决pycharm无法调用pip安装的包
  • 原文地址:https://www.cnblogs.com/cocox/p/4448995.html
Copyright © 2011-2022 走看看