文档章节

quick-cocos2d-x图片资源加密

SunLightJuly
 SunLightJuly
发布于 2013/12/12 23:08
字数 1113
阅读 11224
收藏 13
点赞 2
评论 28

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

© 著作权归作者所有

共有 人打赏支持
SunLightJuly
粉丝 59
博文 15
码字总数 12480
作品 0
成都
加载中

评论(28)

阿杰程序员
阿杰程序员

引用来自“阿杰程序员”的评论

我加密完了.......但是不知道生成ui.zip 如何解压 如何加载使用?

引用来自“SunLightJuly”的评论

怎么会生成zip的呢?图片资源是只加密不打包的。请再仔细阅读文章,理解一下原理;另外本文下面的评论也可以看看,我给其他朋友的回复应该能解决你的问题了。
恩 解决了......我多加了个 zip字段
SunLightJuly
SunLightJuly

引用来自“阿杰程序员”的评论

我加密完了.......但是不知道生成ui.zip 如何解压 如何加载使用?
怎么会生成zip的呢?图片资源是只加密不打包的。请再仔细阅读文章,理解一下原理;另外本文下面的评论也可以看看,我给其他朋友的回复应该能解决你的问题了。
阿杰程序员
阿杰程序员
麻烦楼主加下本人QQ 386351746 解答一下.............
阿杰程序员
阿杰程序员
我加密完了.......但是不知道生成ui.zip 如何解压 如何加载使用?
SunLightJuly
SunLightJuly

引用来自“星魂之坠”的评论

你好,我在windows中libcocos项目配置C++中引入了HelperFunc的目录,但是在链接的时候报错了,应该是没有找到自己加的那个cpp,Helper Func.cpp在工程目录下,没有加到libcocos的工程,应该怎么处理一下呢?不太清楚VS的配置该怎么设置
你出现这个问题应该是3.x版本吧。因为3.x的Windows工程用了dll库,所以这里是会有些问题。解决方法倒是有几种,如果你不太熟悉的话,可以参考我在quick 3.3的github分支上所做的修改:https://github.com/dualface/v3quick。如果想具体一点看与资源解密相关的修改,可以看这个PR:https://github.com/dualface/v3quick/commit/916f96d34bd33ca04c3503cc43b39e061e438632
星魂之坠
星魂之坠
你好,我在windows中libcocos项目配置C++中引入了HelperFunc的目录,但是在链接的时候报错了,应该是没有找到自己加的那个cpp,Helper Func.cpp在工程目录下,没有加到libcocos的工程,应该怎么处理一下呢?不太清楚VS的配置该怎么设置
SunLightJuly
SunLightJuly

引用来自“zhmx”的评论

楼主你好。很高兴看到你这篇文章。我按照教程配置修改了,但是还是出现了图格式错误的问题。
pack_files.bat -i res -o resSec -ek 123456 -es 654321 使用这个打包了png图片
我已经在Image::initWithImageFile里面改成 HelperFunc::getData(_filePath);,然后在appdelegate.cpp里面的applicationDidFinishLaunching加了
stack->setXXTEAKeyAndSign("123456", strlen("123456"), "654321", strlen("654321"));。但是就是有问题
[LUA ERROR] ASSERT FAILED ON LUA EXECUTE: unsupport image format!
请指导。
这个记得已经在QQ上解决了
SunLightJuly
SunLightJuly

引用来自“rabee”的评论

quick3.3final 改了,但是编译不过去,这个如何解决呢?
请参考我在quick 3.3的github分支上所做的修改:https://github.com/dualface/v3quick
r
rabee
quick3.3final 改了,但是编译不过去,这个如何解决呢?
zhmx
zhmx
楼主你好。很高兴看到你这篇文章。我按照教程配置修改了,但是还是出现了图格式错误的问题。
pack_files.bat -i res -o resSec -ek 123456 -es 654321 使用这个打包了png图片
我已经在Image::initWithImageFile里面改成 HelperFunc::getData(_filePath);,然后在appdelegate.cpp里面的applicationDidFinishLaunching加了
stack->setXXTEAKeyAndSign("123456", strlen("123456"), "654321", strlen("654321"));。但是就是有问题
[LUA ERROR] ASSERT FAILED ON LUA EXECUTE: unsupport image format!
请指导。
quick-cocos2d-x图片资源加密(续)

前篇: quick-cocos2d-x图片资源加密 让quick-cocos2d-x支持加密的plist文件 通过前篇的修改,我们已经能够在Windows平台的player,以及Android上使用加密的常见格式(png、jpg等)的图片资源了...

SunLightJuly ⋅ 2014/01/03 ⋅ 4

浅析Android手游lua脚本的加密与解密

本文转载自 梦幻西游手游美术资源加密分析 浅析android手游lua脚本的加密与解密 lua、luac、luaJIT三种文件的关系 lua手游过程中有三种文件:lua、luac、luaJIT。lua是明文代码,直接用记事本...

qq_32400847 ⋅ 2017/11/12 ⋅ 0

loadChunksFromZIP效率问题

@SunLightJuly 你好,想跟你请教个问题:quick-cocos2d-x加密成zip包。调用loadChunksFromZIP函数加载,我看到你一个文章说是一次全部加载了所有文件,但我一个游戏大概上百文件。一次性加载...

睡到自然醒 ⋅ 2014/12/05 ⋅ 2

quick-cocos2d-x基于源码加密打包功能的更新策略(1)

Quick-cocos2d-x增加了编译及加密源代码的功能(具体可参考这篇文章)。以此功能为基础,我实现了一个版本更新模块,解决了自己项目中的版本更新需求。现抛砖引玉,与大家分享。 从基本原理和方...

SunLightJuly ⋅ 2013/12/01 ⋅ 70

quick-cocos2d-x基于源码加密打包功能的更新策略(2)

前一篇:quick-cocos2d-x基于源码加密打包功能的更新策略(1) 二、更新原理讨论及更复杂的更新功能 1.更新原理 在前面的更新过程中,从服务器取文件列表,并根据文件列表再更新相关的文件,这...

SunLightJuly ⋅ 2013/12/02 ⋅ 50

quick-cocos2d-x基于源码加密打包功能的更新策略(3)

前篇: quick-cocos2d-x基于源码加密打包功能的更新策略(1) quick-cocos2d-x基于源码加密打包功能的更新策略(2) 三、更新流程说明及特性分析 A.更新流程 加载初始安装包,载入旧资源列表 取最...

SunLightJuly ⋅ 2013/12/05 ⋅ 8

quick-cocos2d-x源文件编译及加密详解

quick-cocos2d-x是用lua脚本来写的,而lua是明文形式,如果不对脚本进行处理,那么我们所写的代码将可能暴露给别人(apk和ipa都是简单的zip包装)。 quick-cocos2d-x框架为我们提供了一个可编...

lonewolf ⋅ 2013/11/23 ⋅ 43

QuickXDev增强功能:Compile Scripts(编译及加密源代码)

更新:此功能现在在mac和windows下都可用。 昨天弄清楚了编译和加密脚本的全部过程,今天我把这一功能集成到了QuickXDev,以方便广大开发者使用,详细使用方法如下: 1、 了解基本原理 Quic...

lonewolf ⋅ 2013/11/24 ⋅ 6

quick-cocos2d-x物理引擎之chipmunk(一)

chipmunk是一个用C写成的物理引擎,quick-cocos2d-x已经用C++对其进行封装,导出到lua的类有: CCPhysicsWorldCCPhysicsBodyCCPhysicsShapeCCPhysicsDebugNodeCCPhysicsCollisionEventCCPhys......

lonewolf ⋅ 2013/11/01 ⋅ 0

iMeteOra/cocos2d-x-qt

cocos2d-x-3.0alpha 中看到了Qt后端支持, 把它的.pro收纳囊肿! 其它的, 看有啥可以借鉴的吧. quick-cocos2d-x 是一个可以让您觉得“爽快”的 cocos2d-x 的扩展版。基于 cocos2d-x,完全的跨平...

iMeteOra ⋅ 2014/04/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

中标麒麟(龙芯版)7.0优盘安装

########################################## 制作U盘安装盘: 1.准备U盘: PMON环境下U盘必须格式化成ext3; 昆仑固件环境下可以格式化成ext3,ext4 2.把整个镜像 xxx.iso 复制到U盘下面 3....

gugudu ⋅ 18分钟前 ⋅ 0

老司机写的大数据建模五步走

本文将尝试来梳理一下数据建模的步骤,以及每一步需要做的工作。 01 第一步:选择模型或自定义模式 这是建模的第一步,我们需要基于业务问题,来决定可以选择哪些可用的模型。 比如,如果要预...

gulf ⋅ 27分钟前 ⋅ 0

PacificA 一致性协议解读

PacificA 的 paper 在 08 年左右发出来的,比 Raft 早了 6,7 年。 在 PacificA 论文中,他们强调该算法使用范围是 LAN (Local Area Network),讲白了就是对跨机房不友好。 不管是 ZAB,Raf...

黑客画家 ⋅ 30分钟前 ⋅ 0

盘符图标个性化

设置自己的专属盘符图标 准备ico格式的图片文件一个,在根目录下创建autorun.inf文件 文件内容 [Autorun]icon=logo.ico 重新启动或者插拔U盘即可看到结果...

阿豪boy ⋅ 30分钟前 ⋅ 0

Windows下QQ聊天记录中图片的默认存放位置

Windows下QQ聊天记录中图片的默认存放位置在设置中是没有说明的。 实测位置在:D:\Documents\Tencent Files\974101467\Image 其中: “974101467”为对应的QQ号; “C2C”为个人之间的聊天图...

临江仙卜算子 ⋅ 36分钟前 ⋅ 0

GC 的三种基本实现方式

参考资料《代码的未来》(作者: [日] 松本行弘)。 由于并非本人原著(我只是个“搬运工“),SO 未经本人允许请尽情转载。 另外个人像说明一下这里所说的GC指泛指垃圾回收机制,而单指Jav...

xixingzhe ⋅ 37分钟前 ⋅ 0

Android双击退出

/** * 菜单、返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode......

王先森oO ⋅ 42分钟前 ⋅ 0

idea 整合 vue 启动

刚学习Vue 搭建了一个项目 只能命令启动 Idea里面不会启动 尝试了一下修改启动的配置 如下: 1.首先你要保证你的package.json没有修改过 具体原因没有看 因为我改了这个name的值 就没办法启动...

事儿爹 ⋅ 47分钟前 ⋅ 0

redis在windows环境的后台运行方法

在后台运行,首先需要安装redis服务,命令为 redis-server.exe --service-install redis.windows.conf --loglevel verbose 启动,命令为 redis-server --service-start 停止,命令为 redis-...

程序羊 ⋅ 50分钟前 ⋅ 0

比特币现金开发者提出新的交易订单规则

本周,四位比特币现金的四位开发者和研究员:Joannes Vermorel(Lokad),AmaurySéchet(比特币ABC),Shammah Chancellor(比特币ABC)和Tomas van der Wansem(Bitcrust)共同发表了一篇关...

lpy411 ⋅ 54分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部