cocos2d-x PNG图片资源加密

实现原理

如果你对实现原理并不感兴趣,只是想直接使用的话可以跳过这节。首先我假设读者已经清楚PNG图像文件结构了,如果没有的话这里建议可以看看《揭秘数据解密的关键技术》第5章,这章里面专门对PNG图像格式进行了介绍。或者看看《PNG文件格式详解》这篇文章。

实现原理很简单,只是将PNG文件的文件头和每个数据块的名称给去掉,特殊的数据块(如IHDR和IEND)连数据块内容也一并给去掉。在这之后,已经找不到PNG的特征信息了。但是要怎么解密呢?我将去掉的那些信息按照一定格式保存起来,然后进行AES加密,最后把加密后的数据追加到文件尾,必须要密钥正确的情况下才能解密成功。这样做还有一个好处就是效率更高,一个文件大概只需加密几十字节,而不必加密整个文件,这对手机平台来说还是比较重要的。

如何使用

首先说一下加密解密最简单的方法。先去这里下载我已经编译好的加密和解密程序,如果无法运行你可以自己编译源代码来生成程序(必须要支持C++11的编译器)。

要加密PNG图片,就把 EncryptPNG.exe 文件放到图片所在的文件目录里面执行,然后输入密钥就可以了。然后它就会自动加密所在目录及其子目录的所有PNG图片,并在生成对应的 .epng 文件。

如果想要验证文件是否能够成功解密,只需打开命令窗口,输入 DecryptPNG.exe xxx.epng,然后输入密钥。如果密钥正确的话就会生成一个 .png 文件。这都很简单吧?

在cocos2d-x 上的使用

在cocos2d-x上的使用更为简单,就跟平时创建精灵的方法是一样的。例如:

// add "HelloWorld" splash screen"
auto sprite = Sprite::create("HelloWorld.epng");

// position the sprite on the center of the screen
sprite->setPosition(Vec2(visibleSize / 2) + origin);

// add the sprite as a child to this layer
this->addChild(sprite);

就跟使用普通的PNG图片一样吧?不过在这之前你需要修改一下引擎代码。这里以cocos2d-x 3.6 为例,首先下载这个文件。然后把里面的所有文件拷贝到cocos2d\cocos\base 目录下,在cocos2d\cocos\Android.mk的 LOCAL_SRC_FILES 里面添加 base/CCAES.cpp 和 base/CCDecryptImage.cpp。最后还需要做一件事情,编辑cocos2d\cocos\platform\CCImage.cpp文件,添加头文件 #include "base/CCDecryptImage.h" ,然后修改 initWithImageFile 和 initWithImageFileThreadSafe 函数,将 if (!data.isNull()) 里面的内容替换成下面的:

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 = FileUtils::getInstance()->getDataFromFile(_filePath);

    if (!data.isNull())
    {
        if (splitext(path)[1] == ".epng")
        {
            auto image_data = DecryptImage(path, data);
            ret = initWithImageData(&image_data[0], image_data.size());
        }
        else
        {
            ret = initWithImageData(data.getBytes(), data.getSize());
        }
    }
#endif // EMSCRIPTEN

    return ret;
}

bool Image::initWithImageFileThreadSafe(const std::string& fullpath)
{
    bool ret = false;
    _filePath = fullpath;

    Data data = FileUtils::getInstance()->getDataFromFile(fullpath);

    if (!data.isNull())
    {
        if (splitext(fullpath)[1] == ".epng")
        {
            auto image_data = DecryptImage(fullpath, data);
            ret = initWithImageData(&image_data[0], image_data.size());
        }
        else
        {
            ret = initWithImageData(data.getBytes(), data.getSize());
        }
    }

    return ret;
}

好了大功告成。密钥在CCDecryptImage.cpp文件 DEAULT_KEY 里设置(默认是123456),现在可以运行最开始的那段代码试试能否成功解密了。

源码下载

C++实现的加密和解密的源码

https://github.com/zhangpanyi/EncryptPNG/tree/master/cpp

转载请注明出处:http://www.cnblogs.com/zhangpanyi/

时间: 2024-10-05 04:34:09

cocos2d-x PNG图片资源加密的相关文章

【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图片资源加密

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文件加密后一片乱

cocos2dx 图片资源加密

图片加密使用xxtea来加密,加密秘钥自己定,思路就是自己使用代码首先将图片加密,在程序中使用的时候,在加载图片资源处再将资源解密 加密代码如下: 首先要加载头文件 2.将图片加密 bool jiamiImg(string inputFileName,string outFileName) { string fileName=FileUtils::getInstance()->fullPathForFilename(inputFileName); if(fileName.empty()) { r

Android下资源图片的加密和解密

转载:http://blog.csdn.net/you_and_me12/article/details/7959349    apk文件使用解压工具就能看到drawable等资源,但是有些游戏中的图片资源却是无法看到的. 这个问题探索了许久-- [1]图片资源不放置在drawable文件下,放在assets中(但是解压apk,同样能看到图片资源),以下说说使用方法. 分析:Ⅰ)当图片资源放在drawable中的时候,能有相应的Id去解析: BitmapFactory.decodeResourc

(转)让quick-cocos2d-x支持加密的plist文件

前篇:quick-cocos2d-x图片资源加密 在前篇里面,我们实现了图片资源的加密,但还没有实现plist文件的加密.虽然这一加密不是太重要,但如果要实现也是不难的,以下是修改方法. 对plist文件的解析是在lib\cocos2d-x\cocos2dx\platform\CCSAXParser.cpp里的CCSAXParser::parse(const char *pszFile)里处理的,我们可以看到以下熟悉的语句: char* pBuffer = (char*)CCFileUtils:

Android 资源保护问题——探索

apk文件使用解压工具就能看到drawable等资源,但是有些游戏中的图片资源却是无法看到的. 这个问题探索了许久…… [1]图片资源不放置在drawable文件下,放在assets中(但是解压apk,同样能看到图片资源),以下说说使用方法. 分析:Ⅰ)当图片资源放在drawable中的时候,能有相应的Id去解析: BitmapFactory.decodeResource(res, id)       如果放置在assets下,就需要根据文件的名字去解析(Android提供AssetManage