quick-cocos2d-x图片资源加密

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

###首先咱们要有对图片加密的工具。这个参考compile_scripts脚本,写一个用于加密的脚本就能够了。我本身写的脚本放在这里,你们能够下载使用。(以前没用过php,彻底是照着廖大的脚本修改为的,有写得很差的地方还请多多包涵,呵呵)git

###脚本使用的方法和compile_scripts脚本差很少,将zip包里的文件解压到quick-x的bin目录下就能够用了。安全

###在Windows命令行下,输入如下指令(请确认环境变量PATH里有quick-x的bin目录,不然须要本身加运行路径)app

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文件,请看“后篇”里的内容)ui

###文件加密好之后,咱们须要修改quick-x的平台代码,使得它可以读取加密后的文件。加密

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

###为此咱们须要专门写一个新的getFileData()来代替调用。直接写一个是能够的,放在哪一个文件里也不重要。由于我本身有一个HelperFunc模块,专门放本身增长的功能的,因此我就写在这里面了。文件里的相关代码以下:.net

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图片资源加密(续)

相关文章
相关标签/搜索