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

摘要: 在quick-cocos2d-x上实现的一种图片资源加密的方法,现已经加入官方最新版本之中

###quick-x已经支持用XXTEA加密方式对脚本文件进行加密。在此基础上,自己做了一些工作,对图片资源进行了XXTEA加密,现分享给大家。 ###(2014.5.30加注:quick-x的2.2.3版本已经集成了我递交的pr,现在官方版本代码与文章中类似)

###首先我们要有对图片加密的工具。这个参考compile_scripts脚本,写一个用于加密的脚本就可以了。我自己写的脚本放在这里,大家可以下载使用。(之前没用过php,完全是照着廖大的脚本修改成的,有写得不好的地方还请多多包涵,呵呵)

###脚本使用的方法和compile_scripts脚本差不多,将zip包里的文件解压到quick-x的bin目录下就可以用了。

###在Windows命令行下,输入以下指令(请确认环境变量PATH里有quick-x的bin目录,否则需要自己加运行路径)

pack_files.bat -i olddir -o newdir -ek XXTEA -es tsts

###以上指令是将olddir目录下的所有文件用XXTEA加密后,放到newdir目录下,其中加密密匙为XXTEA,加密记号为tsts。参数的定义与compile_scripts脚本类似,用-h也可以得到帮助,也不多说了。

###MAC下可以用pack_files.sh来加密。

###需要注意的是,现在只支持图片的加密。比如AllSprites.plist和AllSprites.png这样的一对纹理文件,只能加密png文件,plist文件加密后是用不了的。(注:现在已经支持plist文件,请看“后篇”里的内容)

###文件加密好以后,我们需要修改quick-x的平台代码,使得它能够读取加密后的文件。

###载入图片的函数是lib\cocos2d-x\cocos2dx\platform\CCImageCommon_cpp.h里面的CCImage::initWithImageFile()和CCImage::initWithImageFileThreadSafe()。再进一步看,这两个函数里都是使用CCFileUtils::sharedFileUtils()->getFileData()来获得文件数据的,我们只需要在获取数据时把文件数据解密即可。

###为此我们需要专门写一个新的getFileData()来代替调用。直接写一个是可以的,放在哪个文件里也不重要。因为我自己有一个HelperFunc模块,专门放自己增加的功能的,所以我就写在这里面了。文件里的相关代码如下:

HelperFunc.h

#ifndef Cocos2Dx_HelperFunc_h
#define Cocos2Dx_HelperFunc_h

NS_CC_BEGIN

class CZHelperFunc
{
public:
    static unsigned char* getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize);

};

NS_CC_END

#endif //Cocos2Dx_HelperFunc_h

HelperFunc.cpp

#include "cocos2d.h"
extern "C" {
#include "lua.h"
#include "xxtea.h"
}
#include "CCLuaEngine.h"
#include "HelperFunc.h"

USING_NS_CC;

unsigned char* CZHelperFunc::getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize)
{
  unsigned long size;
  unsigned char* buf = CCFileUtils::sharedFileUtils()->getFileData(pszFileName, pszMode, &size);
  if (NULL==buf) return NULL;

  CCLuaStack* stack = CCLuaEngine::defaultEngine()->getLuaStack();
  unsigned char* buffer = NULL;

    bool isXXTEA = stack && stack->m_xxteaEnabled;
    for (unsigned int i = 0; isXXTEA && i < stack->m_xxteaSignLen && i < size; ++i)
    {
        isXXTEA = buf[i] == stack->m_xxteaSign[i];
    }

    if (isXXTEA)
    {
        // decrypt XXTEA
        xxtea_long len = 0;
        buffer = xxtea_decrypt(buf + stack->m_xxteaSignLen,
                               (xxtea_long)size - (xxtea_long)stack->m_xxteaSignLen,
                               (unsigned char*)stack->m_xxteaKey,
                               (xxtea_long)stack->m_xxteaKeyLen,
                               &len);
        delete []buf;
        buf = NULL;
		size = len;
    }
    else
    {
		buffer = buf;
    }

	if (pSize) *pSize = size;
	return buffer;
}

###因为上面代码里直接使用了CCLuaStack里的密匙等数据,所以要修改一下lib\cocos2d-x\scripting\lua\cocos2dx_support\CCLuaStack.h,把里面的几个属性改成公有的才能调用。当然我这是偷懒了,安全的做法应该是加几个取值的方法,呵呵。

public:
  bool  m_xxteaEnabled;
  char *m_xxteaKey;
  int   m_xxteaKeyLen;
  char *m_xxteaSign;
  int   m_xxteaSignLen;

###另外,我们需要在程序启动时设置一下密匙和标记,这就要修改AppDelegate.cpp里的AppDelegate::applicationDidFinishLaunching(),在下面这句:

CCLuaStack *pStack = pEngine->getLuaStack();

###这句后面加上:

pStack->setXXTEAKeyAndSign("XXTEA", strlen("XXTEA"), "tsts", strlen("tsts"));

###注意最新版本的quick-x里,player的AppDelegate.cpp修改的地方是StartupCall::startup()函数。

###现在把CCImageCommon_cpp.h里的CCFileUtils::sharedFileUtils()->getFileData改为CZHelperFunc::getFileData就可以了。当然,必须包含HelperFunc.h这个头文件才能编译通过。

###(注:initWithImageFileThreadSafe函数里有一段代码是在Android平台上使用getFileDataForAsync来取文件内容,我开始这里没做修改也能在Android上正常运行,可能是因为我没使用到这一载入功能。其实这段代码可以直接去掉,都用CZHelperFunc::getFileData来处理就好。最简单的修改是将“#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)"改成"#if 0"就可以了)

###经过以上修改,quick-x就能够使用加密后的图片资源了。但这只解决了Windows平台(player)和Android平台,其他的修改请看续篇。

后篇: 让quick-cocos2d-x支持加密的plist文件 quick-cocos2d-x图片资源加密(续)

原文地址:https://my.oschina.net/SunLightJuly/blog/184061

原文地址:https://www.cnblogs.com/wodehao0808/p/9104378.html

时间: 2024-10-18 15:13:20

(转)quick-cocos2d-x图片资源加密的相关文章

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

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

(转)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

quick cocos2d x 手机(Android端)启动过程学习

简要学习下quick cocos2d x 在安卓端启动的过程. 首先需要了解一点:quick cocos2d x是依托于Android的activity和GLSurfaceView(继承自SurfaceView)的环境来显示quick层的游戏界面. (1)首先quick类的android游戏从AndroidManifest.xml文件指定的activity(假设AC)启动. (2)AC继承父类的Cocos2dxActivity. (3)调用静态初始化块,加载cocos2dx的动态库.也就是一些C

quick cocos2d-x Xcode下省去clean,让修改的脚本生效

<quick cocos2d-x Xcode下省去clean,让修改的脚本生效> 项目  target     build phases    点击build phase的空白区域 选择Editor     Add Build Phase      Add Run Script Build Phase 编写脚本: 顺序调整:(第二顺位) 这样就可以避免每次修改了lua脚本,都要手动clean,然后再run,太费时间.. quick cocos2d-x Xcode下省去clean,让修改的脚本生

quick cocos2d x场景切换的生命周期函数调用学习

先上一个场景的基本模版: 1 local ModelScene = class("ModelScene", function() 2 return display.newScene("ModelScene") 3 end) 4 5 function ModelScene:ctor() 6 self.sceneName = "ModelScene" 7 -- 注册点击事件监听 8 self.layer = display.newLayer() 9

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

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

cocos2dx 图片资源加密

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