Cocos2d-x游戏资源加密解决方案

概述:

  1. 功能
  2. 演示效果
  3. 工具使用
  4. 应用到cocos2d-x项目
  5. 下载
  6. 总结
  7. 参考资料

功能:

功能:使用AES CBC 模式对文件及目录加解密,可以应用各个跨平台,目前已经在cocos2d-x win32平台和安卓平台通过测试:

关于AES CBC
优点:
1.隐藏了明文模式;
2.分组密码转化为流模式;
3.可以及时加密传送小于分组的数据;
缺点:
1.不利于并行计算;
2.误差传送:一个明文单元损坏影响多个单元;
3.唯一的IV;

演示效果:

enc_thumb.jpg

工具使用:

运行于win7系统 ,输出文件及目录,是工具确定的,不可指定。工具会判断是否已经存在文件或目录,如果存在就会删除

  1. 输入需要加密文件,如:D:SDKpng.png  输出D:SDKpng-enc.png
  2. 输入需要解密文件,如:D:SDKpng.png 输出D:SDKpng-dec.png
  3. 输入需要加密目录,如:D:SDKpng 输出D:SDKpng-enc
  4. 输入需要解密目录,如:D:SDKpng 输出D:SDKpng-dec

应用到cocos2d-x项目

cocos2d-x 是通过getData来读取文件内容的,只是加密plist png jpg 等。
UserDefault这个是读取xml的要小心,本次的应用跳过这个,因为涉及到xml的文件的解析问题,
所以解密的时候判断是不是if (!forString)

  • Win32
    把aes.c aes.h拷贝进到该目录cocos2dcocosplatformwin32
    同时在工程增加两个文件
    CCFileUtilsWin32.cpp插入代码 密码是:123456 自己可以修改

#include “aes.h”

if (!forString)
{
     aes_context aes_ctx;
     unsigned char IV[16];
     unsigned char key[32];
     memset(IV, 0, sizeof(IV));
     memset(key, 0, sizeof(key));
     char password[32] = "123456";
     memcpy(key, password, strlen(password));
     aes_setkey_dec(&aes_ctx, key, 256);
     //CCLOG("buffer :%s", buffer);
     aes_crypt_cbc(&aes_ctx, AES_DECRYPT, size, IV, (unsigned char*)buffer, (unsigned char*)buffer);
     //CCLOG("buffer dec:%s", buffer);
}
  • android
    同样把aes.c aes.h 两文件拷贝进去到cocos2dcocosplatformandroid
    在CCFileUtilsAndroid.cpp插入代码 密码是:123456 自己可以修改

#include “aes.h”

if (!forString)
{
    aes_context aes_ctx;
    unsigned char IV[16];
    unsigned char key[32];
    memset(IV, 0, sizeof(IV));
     memset(key, 0, sizeof(key));
    char password[32] = "123456";
     memcpy(key, password, strlen(password));
    aes_setkey_dec(&aes_ctx, key, 256);
    //LOGD("data :%s", data);
    aes_crypt_cbc(&aes_ctx, AES_DECRYPT, size, IV, (unsigned char*)data, (unsigned char*)data);
    //LOGD("data dec:%s", data);
}

打开目录下 Android.mk 增加
aes.c

  • Mac||Ios
    参考上面的吧笔者没有Xcode

下载

aec.c aec.h 已包含在工具压缩包里面
下载地址:http://pan.baidu.com/s/1dDnb33r

总结:

这个aes算法是可以应用于任何数据加密的,,aes是16位块加密。所以工具加密后,文件大小是会增加一点,因为是得补齐16位,这不足16为的,补’/0’
已经单独放出AES数据加解密:http://www.freeyun.com/aes.html

参考资料:

aes cbc几种模式:http://www.cnblogs.com/happyhippy/archive/2006/12/23/601353.html
aes 开源项目代码,这次是用的源代码是从那抽出来的:https://www.openhub.net/p/xyssl
aes加解密http://www.freeyun.com/aes.html

Vs2013编译Ogre2.0

本文用vs2013对ogre2.0进去编译。ogre2.0目前只是一个开发中的版本,如果需要稳定版本就请下载1.9http://www.ogre3d.org/download/sdk的版本吧。推荐2.1,OGRE2.1更新频率大,2.0就是一个过渡。

本机环境:

windows7 x64

工具安装说明:

分别安装

  1. 跨平台的安装(编译)工具cmake:www.cmake.org
  2. 分布式的源码管理工具tortoisehg:http://tortoisehg.bitbucket.org/
  3. 微软提供给软件开发者开发库DirectX SDK:http://www.microsoft.com/en-us/download/details.aspx?id=6812
  4. 美国微软公司的开发工具visual studio 2013 http://www.visualstudio.com/en-us/downloads
  5. 依赖库vs2013 vs2015库http://pan.baidu.com/s/1pKaFQJp

使用tortoisehg下载源代码:

  1. 下载Dependencies源代码,在D盘建立sdk目录,现在你在d:sdk目录下。右键鼠标看到tortoisehg 选择 clone克隆 在Soucre填入 https://bitbucket.org/cabalistic/ogredeps 然后点击下面的clone 等待 下载完成。
    上图
    ogredeps
  2. 下载ogre2.0的源代码,同样的操作d:sdk目录右键tortoisehg 选择 clone克隆 在Soucre填入https://bitbucket.org/sinbad/ogre 然后点击下面的clone ,记得还需要进入下载好的ogre2.0的源代码目录右键tortoisehg 选择 update 选择v2-0。
    图2
    update 2.0

使用cmake配置并编译Dependencies及Ogre2.0源代码:

  1. Dependencies:我们来打开CMake (cmake-gui),手动拉Dependencies源代码目录下CMakeLists.txt到cmake窗口。点击configur按钮,选择visual studio 12 ,点击finish完成。点击generate生成解决方案。在目录下你就会看到OGREDEPS.sln,vs2013打开编译INSTALL的项目。完成后有目录ogredeps 改名Dependencies 拷贝到ogre2.0源代码的目录。
  2. Ogre2.0:现在拉ogre2.0源代码目录下CMakeLists.txt到cmake窗口,同cmake配置Dependencies操作一样,产生OGRE.sln。设置SampleBrowser为启动项目编译。
    上图
    cmake ogre
  3. 错误:’unistd.h’: No such file or directory
    头文件unistd.h是Linux/Unix的系统调用,包含了许多UNIX系统服务函数原型,如open、read、write、_exit、getpid等函数。在linux下能够编译通过的包含此头文件的程序,在VC下编译时出现了如下问题
    fatal error C1083: Cannot open include file: ‘unistd.h’: No such file or directory
    其实解决这个问题的方法并不难,只要在你的默认库文件夹下(我的电脑是D:Program Files (x86)Microsoft Visual Studio 12.0VCinclude)添加一个unistd.h文件即可,其内容如下:

    #ifndef _UNISTD_H
    #define _UNISTD_H
    #include <io.h>
    #include <process.h>
    #endif /* _UNISTD_H */
    

    参考来源:http://weilihero.blog.163.com/blog/static/13411039520109218831848

更新代码仓库:

在过段时间后,作者更新了代码库,我们同步下,在源代码目录下右击,然后点Sychronize,再点

hg-update
OGRE2.1版本说明:

update2.1的版本源代码,图2

cmake只勾选Samples2

总结:

发现了没有ogre2.0确实编译不是很难,而且编译1.10的版本也没有问题。还不需要boost的库。ogre2.0确实提出很久了,框架大修改,据OGRE2.0的群友林公子说“渲染相对上1.X版本的性能升了3倍”。ogre2.1的也可以用上面的方法编译!

运行提示错误,直接按OK OK OK ……毕竟是不稳定版本。

运行截图

ogre2.0

Cocos2d-x 3.2 环境及工程项目搭建

在工作环境 :win7 X64  vs2013 下配置cocos2d-x 3.2,可命令编译安卓项目或eclipse编译安卓项目

准备工作:

直接打开下面超级链接进行下载

  • JDK                           下载安装
  • ptyhon                       直接安装 ,将D:Python27添加到环境变量path
  • apache-ant                 下载后解压到D:SDk
  • android-ndk                下载后解压到D:SDk
  • adt-bundle-windows    下载后解压到D:SDk
  • Cocos2d-x 3.2            下载后解压到D:SDk

配置Cocos2d-x:

  • WIN+R 按键 输入cmd:

cd D:SDKcocos2d-x-3.2cocos2d-x-3.2

d:

setup.py

提示现在下面的目录:

  • NDK_ROOT  目录 D:SDKandroid-ndk-r9d
  • ANDROID_SDK_ROOT 目录 D:Androidadt-bundle-windows-x86_64-20140624sdk
  • ANT_ROOT     目录 D:SDKapache-ant-1.9.4bin

创建工程

cocos new MyGame -p com.your_company.mygame -l cpp -d D:SDK

会等待小会儿,在拷贝中

编译win32

在 D:SDKMyGameproj.win32 ,就看你熟悉的 MyGame.sln

cd D:SDKMyGame

cocos run -p win32

编译安卓

  1. 拷贝 D:Program FilesJavajdk1.8.0_05libtools.jar到
  2. D:Program FilesJavajre8lib

cd D:SDKMyGame

cocos run -p android -j 4

参考:java 调 ant 出现 Unable to find a javac compiler

http://stackoverflow.com/questions/8400637/unable-to-find-a-javac-compiler

在目录下D:SDKMyGamebindebugandroid 你就会看到MyGame-debug.apk

The android-platform should be equal/larger than 14

这个是因为D:SDKadt-bundle-windows-x86_64-20140624sdkplatforms 没有android-14

如果需要android-14 就得更新SDK Manager

参考:http://jingyan.baidu.com/article/b0b63dbfd0948c4a483070ea.html

那你就运行下面的命令,你看到有android-20

cocos run -p android –ap 20

eclipse编译安卓

  1. File->New->Project->Android Project From Existing Code
  2. Browse to your project directory and Add the project
  3. Click Run as Android Application to run on connected device or emulator.

1

 

同时也要倒入libcocos2dx 的项目,

D:SDKMyGamecocos2dcocosplatformandroid

需要注意还有一种方法:就是拷贝cocos2dcocosplatformandroidjava目录下的src到MyGameproj.android 的,但是这样会导致命令编译安卓项目出错。

SuperTuxKart 创建

编译说明

  • 安装VS 2013或更高版本。 免费的Express版本。
  • 下载源代码 用发行版的或者从git/svn仓库下载。
  • 下载最新的依赖包depdendencies_for_0.8.2.zip
  • 下载最新的资源。 你可以使用svn 。

svn checkout https://svn.code.sf.net/p/supertuxkart/code/stk-assets stk-assets

两个代码仓库”stk-code” “stk-assets必须在同文件夹目录 。

下载cmake并安装。运行cmake  , ‘Where is the source code’,这里是要现在stk-code的。

  • 点击 configure。会跳出是否创建目录,选择是。 选择配置那个vs(VS 2012 = version 11; VS 2013 = version 12) ,,点击 configure ,去掉USE_WIIUS然后再生成 generate 。在 stk-code 目录下就可以看到VS的解决方案。
  • 如果下载发行版0.8.1的,2010 2012都可以编译 .

创建安装程序

下载NSIS并安装

参考资料

OGRE 1.9 Debug AdvancedOgreFramework

可以参考: http://www.ogre3d.org/forums/viewtopic.php?f=5&t=51994

 

AdvancedOgreFramework 最新下载地址(下载有问题的翻墙):

https://bitbucket.org/spacegaier/advancedogreframework/overview

修改SamplesAdvancedOgreFrameworkbinrelease目录下

plugins.cfg->plugins_d.cfg

resources.cfg->resources_d.cfg

拷贝

RenderSystem_Direct3D9_d.dll

RenderSystem_GL_d.dll

到 AdvancedOgreFrameworkbinrelease 目录下

设置工作AdvancedOgreFrameworkbinrelease 目录

关于暗黑世界客户端的通信的一些事

 

就拿登录做一个简单说明
登录:
输入 帐号 和 密码 点击登录后
调用函数void LayerLogin::menuItemCallbackLogin(CCObject* pSender)

用的两个cocos2d-x的三个重要函数

//返回key的对象 ,不存在就返回NULL
CData::getCData()->m_dictionary->objectForKey(101);

//设置key的对象
CData::getCData()->m_dictionary->setObject(message,101);

//移除key的对象
CData::getCData()->m_dictionary->removeObjectForKey(101);

对上面两个函数内部实现有兴趣的去看下源代码,不讨论这个了

101 (它就是key)一个通信数据包的命令ID号 ,是定义好的 服务器端也是

/
//这是一个发送个人登录信息到服务器
Json::FastWriter  writer;
Json::Value person;
person[“username”]=userName;
person[“password”]=password;

std::string
json_file=writer.write(person);//192.168.1.210   114.252.70.61  183.60.243.195
//给服务器发送登录消息
SocketManager::getInstance()->sendMessage(json_file.c_str(), 101);

//0.2 秒回调一次 用于接收服务器的函数
this->schedule(schedule_selector(LayerLogin::receiveLoginData), 0.2);

//接收服务器的数据
void LayerLogin::receiveLoginData(float delta)
{
Message* revMsg2 = (Message *)CData::getCData()->m_dictionary->objectForKey(101);
CCLOG(“%s”,revMsg2);
CData::getCData()->m_dictionary->removeObjectForKey(101);
if(revMsg2){
//解除0.2 秒回调一次
this->unschedule(schedule_selector(LayerLogin::receiveLoginData));
//数据包的解析
char * denglu=revMsg2->data;
CCLog(“%s”,denglu);
CData::getCData()->setSendVal(denglu1);
Json::Reader read;
Json::Value root;
bool result;
Json::Value data;
if(denglu){
if (read.parse(denglu, root)) {
Json::Value data=root[“data”];
std::string message=root[“message”].asString();
result=root[“result”].asBool();
if(result)
{

CData::getCData()->setCharactorId(data[“characterId”].asInt());
hasRole=data[“hasRole”].asBool();
CData::getCData()->setUserId(data[“userId”].asInt());
//。。处理是否通过


}
json是一个库来的,用于系列化 反系列化
关于它的说明 :http://www.json.org/json-zh.html
这是类似 http://www.cnblogs.com/Mainz/archive/2011/03/07/1973361.html

到这里的时候没有看到在那里说明了是在接收服务器数据

SocketClient 类的两个函数都是一直在循环中
//发送数据包线程
static void* ThreadSendMessage(void p);
//接收数据包线程
static void
ThreadReceiveMessage(void *p);

在它ThreadReceiveMessage 你就会看到
设置key对象
CData::getCData()->m_dictionary->setObject(message,bytesToInt(message->commandId));

其实通信的时候,你得知道人家地址,你像你寄个包裹,你不知道地址你寄给谁啊
这个就是我们说的IP地址了!
//就是这里了
SocketManager::getInstance()->startSocket();
{
//传说中服务器地址……
_socket = new SocketClient(“183.60.242.26”,31009,1,1,NULL);
}

class Message:public CCObject
{
public:
char HEAD0;
char HEAD1;
char HEAD2;
//数据包验证
char HEAD3;
char ProtoVersion;
//版本号 不知道是想做什么用的?
byte serverVersion[4];
//服务器版本号
byte length[4];
byte commandId[4];
/**
* 消息的数据
/
char
data;
Message();

int datalength();

~Message();

};

byte commandId[4];

很奇怪key是int类型是吧,这里
//设置key的对象
CData::getCData()->m_dictionary->setObject(message,101);
可以去查下char[4]互转 int资料。。

一些资料
http://blog.codingnow.com/2006/04/iocp_kqueue_epoll.html
http://blog.csdn.net/shallwake/article/details/5265287
好吧,就写到这里了,其实有好多东西想写的,但是又感觉写不出来!如果有不对的地方请各位指正
等我那天心血来潮就来写下服务器端吧!可能遥遥无期,嘿嘿
网络编程不容易。。。。。。

白银时代

上个月在住院的时候看完了王小波的《黄金时代》,还没写它的阅读后的。现在写写他《白银时代》

我叫王二,未来的世界是银色的,在大学的二年级就是1.8米高的。我喜欢老师,是读物理的,天天起来热力学,就这样开始了,常做梦“未来的世界是银色的”。老师说的。

是位作家,喜欢在公司办公室枪毙别人草稿,给枪毙的人会”气哼哼“踩我脚。写着一部小说叫《我和老师》。在小说里,描述着老师的性感,喜欢趟在我身上,就算床是只能睡一个人的,都叫我不要动。写着,,,太出格了,上司大姐把我“枪毙”了。是个历史的博士,给公司安排去改造,因为我犯错误了,犯的是思想的错误。犯思想错误是最重的那种,公司把我车,信用卡,房子都收了,送了另外的身份,去做小工。之前为了不给安置,我还特意去弄了张-哲学家的卡片,是我师妹帮我的,我师妹也给我害了。在公司还有个女作家需要说明下,天天起来,问我“怎么写小说”。女作家在之前给公司叫去讨厌生活,谁知道半夜路上给四个人轮奸了。算了体验生活了吧,天问问写小说,我给了她一推数学题。。

公司安排我去改造:做小工,一般公司还会派个女人过来一起住,起初我是安安分分的,我给了自取了M,那个女人自然就叫F了。我就想着,F是公司派的吧。来监视我的,晚上我们都睡在同一张床上,F就脱了衣服睡觉,但是我对F没兴趣。不过我也不怕F去报我的都在干些什么。期间:我的《我和老师》小说在法国获奖了,有好多钱,都给公司收走。后来F说了,她是是心理学的,来我这里就是为了研究我的病情,像我这种人,犯错误的人都会有一种病,病的名字我也忘了。我“不干白不干”,F感觉她亏了,本来想研究我病了,最后和我做爱,天天干了很多。。。露骨了。。F走了。。

我有两个舅舅,大舅是数学家,曾经去美国留学。他导师说他是数学天才,是我和通信我才知道的。大舅回国后继续研究数学,给他导师寄研究结果,告诉他这些国外早就研究了。变傻瓜了。。。是回国变的,我舅妈是给物理老师。游泳就喜欢靠着她盯着胸部,才有骂我是”小坏蛋“。大舅是派出所的常客,还有个小阿姨,是派出所的,叫我大舅脱光,o(︶︿︶)o 唉后面我就不说了。。。大舅动过手术,心脏臭了,。死了,。。大舅妈嫁了有钱人,还常给我(当时我在改造)打电话问在那里。

2015年,小舅是个画家,有执业照的,天天起来画,有次小偷来到家里,看他画的,怕他出事,告诉他“画不是这样画的”。得说下小偷,小偷会把你家里垃圾收走,打扫你房间干净,再偷你钱。听说小偷在派出所死了,小偷尸体生前的遗嘱:给医学院,那女学生都抢着他尸体。教员,问小舅:“你画的是什么”。小舅不知道,其实小舅说是牛啊,猪,,,就不就用去监狱了,每次都要我领回来,我妈年纪大嘛。小舅常卖画给小日本人。小舅给蹲监狱,认识了我小舅妈。赶去劳改了,这夫妻的生活不谈了。小舅妈漂亮啊,蹲监狱都能够带一个回来,早知道我去蹲算了。有必要补充,我和小舅长的挺像的。小舅为了生存下,说爱小舅妈,先是利用,后才占便宜。小舅妈现代话“公务员”。小舅也出来了,要多谢我小舅妈

在说这些之前我干许多职业,去守厕所,收小费,不给小费的,狠狠的踹几脚,他们就乖乖给。结果是知道的,不能干下去了,。。。既然我那像我小舅,那我就是一个艺术家。天天想艺术的味道。说小那收画的小日本人,有次,他带黑人老婆在大街上逛,派出所的人把她抓走了,打到出了很多水,问是不是卖画的,小日本人赶紧去找大使馆,派出所赶紧改头换面,美容院的,在美容。有小日本人带着白色的老婆也是在大街上逛,又给派出所抓走了,后面你们就知道了,柔道院。我在大街上嘛,突然一个人扣住我袖口,大声“是不是王二”,平静的回“我是王二的外甥”。那人就是派出所的,你以为他走远了?偷偷在后面跟着我,看我是不是很紧张。如我给抓了,我就一给练拳的。

最好一段记的模糊了,王二在思考艺术的真谛。

再读《大秦帝国》

之前一直想写一些阅读《大秦帝国》后评论的,在学校时没静心认真的去读,也有其中的原因:“不喜欢看所谓的小说”。第一次接触到的是因为电视剧,是在大二的时候吧!一口气看完第一部,很受震撼!法制让一个秦国由弱走到强一直到最后的死亡!《大秦帝国》一共六部,4000多页,我还第二次阅读还没完成只写下部分的感受流水账。

从这套书里面,体制是很重要的,就算是在领导层次出错走向下滑甚至灭亡的路上,体制都可以保障到一个国家及一个企业等的还有充足的时间给予挽救,这个可以从跨国公司(IBM,Intel等公司)有体会的。算是中国中央集权制的一种体会吧。感受下封建社会的集权制,就像这种说的。帝国,没那个国家敢称为帝国,帝国是具备三种要素:其一,统一辽阔的国土(小国家没有帝国);其二,专制统治(民主制没有帝国);其三,强大的军事扩张(无扩张不成帝国)。秦帝国存在总才15年的时间,它的影响是深远的。包括我本人都不是很喜欢秦国的历史,秦始皇“焚书坑儒”这段历史太让人。。

书里面让你体会一个历史的史诗,波澜壮阔的场面。如果喜欢历史的人可以读《二十四史》如果想就加清朝的话就二十五史了,然后对比不同朝代诞生,繁荣走到灭亡,相信会收获不少的。。。下面就只谈谈这套书秦朝的一些感受

第一部 黑色裂变

   起点:秦献公在秦魏大战深受重伤,嬴渠梁(秦献公次子)临危即位:秦孝公。在秦国受六国围攻下,秦献公割地、贿赂及平定内乱让秦国过渡灭顶之灾。在平衡庙堂里的各种势力,大量搜集人才实施秦孝公大战略,变法。引出历史著名“商鞅变法”,通常变法的人,一般没好的结局,在中国历史上变法的变法可以找的到他们最后去处。这些人思想具备前瞻性,也正是前瞻性,不断接受旧势力的考验。如没国君的强有力的支持,充分的放权。过程:“变法的人,拟出草稿,让国君审阅->以国君名义对外公开”,国君不干预内部事物,就算是国君的亲戚,都不会干预。其中最重要的一点是,让变法的人具备极高的地位,确立其威望,“法制”还是“人治”。秦国强大了,秦孝公劳累病倒嬴驷即为(秦惠王),最后是旧势力以古法“车裂商鞅”,密谋复辟旧体制触发第二部的->国命纵横。

第二部 国命纵横

秦惠王平定旧视力,让上一代退出舞台,起用忠实于新法的年轻官吏,继续变法,。苏秦、张仪也开始走向历史舞台,看点“连横合纵”。“合纵”:联合弱国共同抵抗强国,“连横”:联合强国制衡第三国。苏秦和张仪为主角的展开了精彩的外交攻防。张仪,代表秦国连横,苏秦:六国合纵,系六国宰相。透露下,两人的位置一开始是相反的,苏秦,第一次是进的秦国。两人的关系是师兄弟。连横合纵,不过是给各个国家一次变法强大的机会,让它们公平竞争。张仪结好燕国,派出人质,埋下伏笔。不管是连横还是合纵,最终赢家都是秦国,它变得越来越强大,而六国却越来越微弱了。 苏秦入了齐国,主导齐国变法,后遭旧贵族买凶杀害。秦惠王病倒,原因不明,张仪退隐。。。。。尚武力的秦武王即位。

第三部 金戈铁马

秦武王率领大军进军雒阳,举鼎重伤后暴毙。下诏迎回燕国做人质的少年秦稷即位秦昭王,母子稳定朝局。齐闵王集结六国围攻秦国,被白起以少击败并趁机扩大秦国版图。齐闵王不过是想借助六国时机好吞并宋国,可惜了,再和燕国结下仇恨(集结六国中齐闵王杀掉燕国大将,并要燕国道歉)。燕国名将乐毅秘密联结五国(楚国不在内)围攻齐国,下文等我看完了。。。。。

这一部重点是:范雎:“远交近攻”

第四部 阳谋春秋

第五部 铁血文明

第六部 帝国烽烟

mingw编译zlib

在安常规编译在报的错误“please use win32/makefile.gcc instead”
下面的方法即可解决
mingw编译最新版的zlib,这个是简要的操作说明:
cp win32/makefile.gcc makefile.gcc
make -fmakefile.gcc
export “INCLUDE_PATH=G:/mingw/zlib-1.25/include”
export “LIBRARY_PATH=G:/mingw/zlib-1.25/lib”
make install -fmakefile.gcc
cp zlib1.dll G:/mingw/zlib-1.25//bin

未命名
参考:http://www.gaia-gis.it/spatialite-2.4.0/mingw_how_to.html