Cocos2d-x游戏资源加密解决方案

概述:

  1. 功能
  2. 演示效果
  3. 工具使用
  4. 应用到cocos2d-x项目
  5. 下载
  6. 总结
  7. 参考资料

功能:

功能:使用AES CBC 模式对文件及目录加解密,可以应用各个跨平台,目前已经在cocos2d-x win32平台和安卓平台通过测试:

关于AES CBC
优点:
1.隐藏了明文模式;
2.分组密码转化为流模式;
3.可以及时加密传送小于分组的数据;
缺点:
1.不利于并行计算;
2.误差传送:一个明文单元损坏影响多个单元;
3.唯一的IV;

演示效果:

enc_thumb.jpg

工具使用:

运行于win7系统 ,输出文件及目录,是工具确定的,不可指定。工具会判断是否已经存在文件或目录,如果存在就会删除

  1. 输入需要加密文件,如:D:SDKpng.png  输出D:SDKpng-enc.png
  2. 输入需要解密文件,如:D:SDKpng.png 输出D:SDKpng-dec.png
  3. 输入需要加密目录,如:D:SDKpng 输出D:SDKpng-enc
  4. 输入需要解密目录,如:D:SDKpng 输出D:SDKpng-dec

应用到cocos2d-x项目

cocos2d-x 是通过getData来读取文件内容的,只是加密plist png jpg 等。
UserDefault这个是读取xml的要小心,本次的应用跳过这个,因为涉及到xml的文件的解析问题,
所以解密的时候判断是不是if (!forString)

  • Win32
    把aes.c aes.h拷贝进到该目录cocos2dcocosplatformwin32
    同时在工程增加两个文件
    CCFileUtilsWin32.cpp插入代码 密码是:123456 自己可以修改

#include “aes.h”

if (!forString)
{
     aes_context aes_ctx;
     unsigned char IV[16];
     unsigned char key[32];
     memset(IV, 0, sizeof(IV));
     memset(key, 0, sizeof(key));
     char password[32] = "123456";
     memcpy(key, password, strlen(password));
     aes_setkey_dec(&aes_ctx, key, 256);
     //CCLOG("buffer :%s", buffer);
     aes_crypt_cbc(&aes_ctx, AES_DECRYPT, size, IV, (unsigned char*)buffer, (unsigned char*)buffer);
     //CCLOG("buffer dec:%s", buffer);
}
  • android
    同样把aes.c aes.h 两文件拷贝进去到cocos2dcocosplatformandroid
    在CCFileUtilsAndroid.cpp插入代码 密码是:123456 自己可以修改

#include “aes.h”

if (!forString)
{
    aes_context aes_ctx;
    unsigned char IV[16];
    unsigned char key[32];
    memset(IV, 0, sizeof(IV));
     memset(key, 0, sizeof(key));
    char password[32] = "123456";
     memcpy(key, password, strlen(password));
    aes_setkey_dec(&aes_ctx, key, 256);
    //LOGD("data :%s", data);
    aes_crypt_cbc(&aes_ctx, AES_DECRYPT, size, IV, (unsigned char*)data, (unsigned char*)data);
    //LOGD("data dec:%s", data);
}

打开目录下 Android.mk 增加
aes.c

  • Mac||Ios
    参考上面的吧笔者没有Xcode

下载

aec.c aec.h 已包含在工具压缩包里面
下载地址:http://pan.baidu.com/s/1dDnb33r

总结:

这个aes算法是可以应用于任何数据加密的,,aes是16位块加密。所以工具加密后,文件大小是会增加一点,因为是得补齐16位,这不足16为的,补’/0’
已经单独放出AES数据加解密:http://www.freeyun.com/aes.html

参考资料:

aes cbc几种模式:http://www.cnblogs.com/happyhippy/archive/2006/12/23/601353.html
aes 开源项目代码,这次是用的源代码是从那抽出来的:https://www.openhub.net/p/xyssl
aes加解密http://www.freeyun.com/aes.html

78人评论了“Cocos2d-x游戏资源加密解决方案”

  1. 博主你好 请问你可以贴一下加密部分的代码 我写的加密 用工具解密不了。。。
    unsigned char* data = temData.getBytes();
    aes_context aes_ctx;
    unsigned char IV[16];
    unsigned char key[32];
    memset(IV, 0, sizeof(IV));
    memset(key, 0, sizeof(key));
    char password[32] = “123456”;
    memcpy(key, password, strlen(password));
    aes_setkey_enc(&aes_ctx, key, 256);
    aes_crypt_cbc(&aes_ctx, AES_ENCRYPT, temData.getSize(), IV, data, data);

  2. 博主你好 请问你可以贴一下加密部分的代码 我写的加密 用工具解密不了。。。
    unsigned char* data = temData.getBytes();
    aes_context aes_ctx;
    unsigned char IV[16];
    unsigned char key[32];
    memset(IV, 0, sizeof(IV));
    memset(key, 0, sizeof(key));
    char password[32] = “123456”;
    memcpy(key, password, strlen(password));
    aes_setkey_enc(&aes_ctx, key, 256);
    aes_crypt_cbc(&aes_ctx, AES_ENCRYPT, temData.getSize(), IV, data, data);

  3. 博主 可以提供加密代码么 我用c++写的加密代码 用工具解密不了
    好像加密的字符串比原来的字符串长度变短了 这是什么原因啊 十分感谢

  4. 博主 可以提供加密代码么 我用c++写的加密代码 用工具解密不了
    好像加密的字符串比原来的字符串长度变短了 这是什么原因啊 十分感谢

  5. 您好,请问你在CCFileUtilsAndroid里加的代码加在哪个方法里。能不能把您的工程发给我,万分感谢。

  6. 您好,请问你在CCFileUtilsAndroid里加的代码加在哪个方法里。能不能把您的工程发给我,万分感谢。

  7. 你好,请教一个问题,解码加载部份按你的教程加进去了,Data data=FileUtils::getInstance()->getDataFromFile(“tx/brtext-enc.png”);//brtext-enc.png加密过的图片/* if (!data.isNull()) { Image->initWithPngData(data.getBytes(), data.getSize()); }*/我现在的疑惹是,要怎么才能把读出来的二进制 data转成可以用 Texture2D ,然后我想 把它放资源缓存里面去,SpriteFrameCache::getInstance()->addSpriteFramesWithFile(“tx/brtext.plist”,texture);新手,问题有点呆,

  8. 你好,请教一个问题,解码加载部份按你的教程加进去了,Data data=FileUtils::getInstance()->getDataFromFile(“tx/brtext-enc.png”);//brtext-enc.png加密过的图片/* if (!data.isNull()) { Image->initWithPngData(data.getBytes(), data.getSize()); }*/我现在的疑惹是,要怎么才能把读出来的二进制 data转成可以用 Texture2D ,然后我想 把它放资源缓存里面去,SpriteFrameCache::getInstance()->addSpriteFramesWithFile(“tx/brtext.plist”,texture);新手,问题有点呆,

    1. 音频,要看它音频怎么读取数据的。读取内容出来然后解密。cocos2d音频读取内容我没去看过。

    1. 音频,要看它音频怎么读取数据的。读取内容出来然后解密。cocos2d音频读取内容我没去看过。

  9. 我看音乐文件我就不先加密了,有空了在研究。
    博主,你的加解密工具是用 QT 写的?
    不知道能不能寄一份源码给我?我自己写的代码一直出现问题。

  10. 我看音乐文件我就不先加密了,有空了在研究。
    博主,你的加解密工具是用 QT 写的?
    不知道能不能寄一份源码给我?我自己写的代码一直出现问题。

  11. Pingback: AES加解密 - 自由云

  12. Pingback: AES加解密 - 自由云

  13. 自己参照着写了个,但加密后保存的文件,在打开解密总是有问题,博主能发下工具源码吗? 非常感谢.3239939308@qq.com

  14. 自己参照着写了个,但加密后保存的文件,在打开解密总是有问题,博主能发下工具源码吗? 非常感谢.3239939308@qq.com

  15. 小文件,资源小,可以用,资源大了,22M左右,一加载就挂掉,这大概是怎么什么问题
    Fatal signal 11 (SIGSEGV) at 0x0000002c (code=1), thread 1334 (Thread-68)

      1. 一共是22M,也是分为一个个的小文件,一加密加载没有问题,用这个工具,方法,加密过后,一加载就挂了,

        1. 一共是22M,也是分为一个个的小文件,不加密加载没有问题,用这个工具,方法,加密过后,一加载就挂了

  16. 小文件,资源小,可以用,资源大了,22M左右,一加载就挂掉,这大概是怎么什么问题
    Fatal signal 11 (SIGSEGV) at 0x0000002c (code=1), thread 1334 (Thread-68)

      1. 一共是22M,也是分为一个个的小文件,一加密加载没有问题,用这个工具,方法,加密过后,一加载就挂了,

        1. 一共是22M,也是分为一个个的小文件,不加密加载没有问题,用这个工具,方法,加密过后,一加载就挂了

  17. 楼主我将解密代码添加到cocos工程运行提示”can’t detect image format”资源都没加载出来是怎么回事呢?

评论区已关闭。

Index
滚动至顶部