zoukankan      html  css  js  c++  java
  • (转)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的平台代码,使得它能够读取加密后的文件。

    ###载入图片的函数是libcocos2d-xcocos2dxplatformCCImageCommon_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里的密匙等数据,所以要修改一下libcocos2d-xscriptingluacocos2dx_supportCCLuaStack.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

  • 相关阅读:
    将n个不同的球放到m个相同的袋子里有多少种方案?

    平面分割直线2
    差分
    并查集(UnionFind)
    约瑟夫环公式
    Kruskal
    线性欧拉筛
    SPAF
    Dijkstra
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/9104378.html
Copyright © 2011-2022 走看看