quck cocos2dx-lua 3.5 版本对图片进行加密

quck cocos2dx-lua 3.5 版本对图片进行加密


一、图片的加密

使用“pack_list”(这个不知道是出自哪里)进行加密

下载地址 http://pan.baidu.com/s/1gdg2qUf

然后下载“php-5.6.14-nts-Win32-VC11-x86”

打开pack_list,修改pack_files.bat里面的php.exe的目录如下

@echo offset DIR=%~dp0E:\php-5.6.14-nts-Win32-VC11-x86\php.exe "%DIR%lib\pack_files.php" %*


按住shift点击右键,选择“在此处打开命令窗口”,执行

pack_files.bat -h

返回信息如下

 options:
    -h show help
    -i source files directory
    -o output filename | output directory
    -p package prefix name
    -x excluded packages
    -m pack mode
    -ek encrypt key
    -es encrypt sign
    -c load options from config file
    -q quiet
pack mode:
    -m zip                  package all files to a ZIP archive file and encrypt.
    -m files (default)  save encrypted files to separate files. -o specifies output dir.
                        * default encrypt sign is "XXTEA"
config file format:
    return array(
        'src'      => source files directory,
        'output'   => output filename or output directory,
        'prefix'   => package prefix name,
        'excludes' => excluded packages,
        'pack'  => pack mode,
        'key'      => encrypt key,
        'sign'     => encrypt sign,
    );
examples:
    # encrypt res/*.* to resnew/, with XXTEA, specifies sign
    pack_files -i res -o resnew -ek XXTEA -es tsts
    # package res/*.* to game.zip
    pack_files -i res -o game.zip -m zip
    # package scripts/*.* to game.zip, encrypt game.zip with XXTEA, specifies sign
    pack_files -i scripts -o game.zip -m zip -ek XXTEA -es tsts
    # load options from config file
    pack_files -c my_config.lua

输入命令

pack_files.bat -i 需要加密的资源目录 -o 加密后文件存放目录 -ek 你的key -es 你的sign

此时加密就完成了


这个加密是XXTEA方式的,也可用于加密lua脚本


二、图片是加密过的,cocos是不能解析的,需要解密(好像2.x的版本不需要,不知道是不是)


1,若是加密lua脚本(别忘了,先备份源码),只需将你的工程Classes目录下的AppDelegate.cpp文件的

找到下面这行(没有就加上,在LuaStack* stack = engine->getLuaStack();这行下面)

stack->setXXTEAKeyAndSign("2dxLua", strlen("2dxLua"), "XXTEA", strlen("XXTEA"));

把sign和key替换上去,如下,保存

stack->setXXTEAKeyAndSign("你的key", strlen("你的key"), "你的sign", strlen("你的sign"));

重新编译(别忘了,先备份源码),就可以运行加密后的lua脚本了


2,若是加密的图片(这个修改有点麻烦,不会c++所以,一要改c++代码就头疼)

先找到libcocos2d/platform这个目录

quck cocos2dx-lua 3.5 版本对图片进行加密_第1张图片

然后将:

HelperFunc.cppHelperFunc.h (frameworks\cocos2d-x\cocos\quick_libs\src\extra\apptools目录下

xxtea.cppxxtea.h(目录忘了在哪了),

这四个文件都拷贝到platform这个目录下(首先要在资源管理器中复制到platform,然后将platform目录下的这四个文件拖到visual studio中视图中的platform目录

HelperFunc.cpp修改如下(主要是去掉了LuaEngine相关的代码,实在不会c++,报错了完全看不懂,所以就直接干掉了

 #include "cocos2d.h"
extern "C" {
}
#include "xxtea/xxtea.h"
#include "HelperFunc.h"
USING_NS_CC;
unsigned char* HelperFunc::getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize)
{
    ssize_t size;
    unsigned char* buf = FileUtils::getInstance()->getFileData(pszFileName, pszMode, &size);
    if (NULL == buf || size<1) return NULL;
    printf("FFF---------------HelperFunc");
    //LuaStack* stack = LuaEngine::getInstance()->getLuaStack();
    //if (NULL==stack) {
    //    return NULL;
    //}
    int xxteaKeyLen = 7;
    const char *xxteaKey = "xingyun";
    int xxteaSignLen = 3;
    const char *xxteaSign = "ooi";
    unsigned char* buffer = NULL;
    if (xxteaKey && xxteaSign) {
        bool isXXTEA = true;
        for (int i = 0; isXXTEA && i<xxteaSignLen && i<size; ++i) {
            isXXTEA = buf[i] == xxteaSign[i];
        }
        if (isXXTEA) { // decrypt XXTEA
            xxtea_long len = 0;
            buffer = xxtea_decrypt(
                buf + xxteaSignLen,
                (xxtea_long)size - (xxtea_long)xxteaSignLen,
                (unsigned char*)xxteaKey,
                (xxtea_long)xxteaKeyLen,
                &len);
            delete[]buf;
            buf = NULL;
            size = len;
        }
        else {
            buffer = buf;
        }
    }
    else {
        buffer = buf;
    }
    if (pSize) *pSize = size;
    return buffer;
}
int HelperFunc::getFileData(const char *pPathFile)
{
unsigned long size;
unsigned char* buf = HelperFunc::getFileData(pPathFile, "rb", &size);
delete buf;
/*
LuaStack* stack = LuaEngine::getInstance()->getLuaStack();
stack->clean();
if (buf) {
stack->pushString((const char*)(buf), (int)size);
delete buf;
} else {
stack->pushNil();
}
*/
return 1;
}
Data HelperFunc::getData(const std::string &filename)
{
    unsigned long sz;
    unsigned char * buf  = HelperFunc::getFileData(filename.c_str(), "rb", &sz);
    if (!buf) {
    return Data::Null;
    }
    Data data;
    data.fastSet(buf, sz);
    return data;
    /*
    return Data::Null;*/
}


打开platform下的CCImage.cpp,按

将有FileUtils::getInstance()->getDataFromFile的方法都修改如下

//Data data = FileUtils::getInstance()->getDataFromFile(_filePath);	
Data data = HelperFunc::getData(_filePath);

并在CCImage.cpp文件头部引入HelperFunc.h

#include "HelperFunc.h"

重新编译,就可以加载加密后的文件了(也可以只加密部分文件,部分不加密都行,cocos会自动识别)


三、加密后到android上运行

经过上面两步操作结果发现,虽然在win32下可以运行,但是一到android就黑屏,显示不了图片,说图片格式不支持

弄这个图片加密整整整了两天,终于弄好了,下面是步骤(但具体是那些步骤是必须的还不知道)


复制frameworks\cocos2d-x\cocos\quick_libs\src\extra\apptools

到frameworks\cocos2d-x\extensions\目录,那个xxtea也找到,然后复制到这里


下面是我工程里面现存的有多个叫HelperFunc.cpp的文件,我试着删了一个,但编译就过不了了(所以还是不管了,都留着吧),

但是经过测试发现最终起作用的是

frameworks\cocos2d-x\cocos\quick_libs\src\extra\apptools这个目录里面的

下面是我的工程里的所有的HelperFunc.cpp

frameworks\cocos2d-x\cocos\quick_libs\src\extra\apptoolsframeworks\cocos2d-x\extensions\apptoolsframeworks\cocos2d-x\cocos\platform


使用以下命令将工程编译到android版

cocos compile -p android

若是报HelperFunc或该文件引用的文件缺失,则

修改frameworks\cocos2d-x\cocos\Android.mk,然后重新编译,

由于修改次数过多,我也不知道那些有用,那些没用了

quck cocos2dx-lua 3.5 版本对图片进行加密_第2张图片

quck cocos2dx-lua 3.5 版本对图片进行加密_第3张图片

好了,修改完成














你可能感兴趣的:(Cocos,Quick,图片加密)