cocos2dx游戏资源加密之XXTEA

在手机游戏当中,游戏的资源加密保护是一件很重要的事情。

我花了两天的时间整理了自己在游戏当中的资源加密问题,实现了跨平台的资源流加密,这个都是巨人的肩膀之上的。

大概的思路是这样的,游戏资源通过XXTEA加密方法对流的加密方式,有自己的密钥和标识,通过标识可知是否有加密,密钥是自己程序当中的。除非有密钥,否则很难通过解出正确的文件。经过加密后,加密文件也就是游戏资源放在resource的自己文件夹中,否则在xcode编译到趁机是会识别不了文件。在程序中cocos2dx底层加入解密过程,就可以把文件正确读取出来,让程序显示。经试验,已经可以读取,png,plist,json文件。

现在记录下实现的步骤

链接: http://pan.baidu.com/s/1ntx98VZ 密码: qyqe 去下载加密资源的脚本,这个是quick-cocos2d-x提取出来的打包工具。

pack_files.sh -i olddir -o newdir -ek XXTEA -es decodetest

把ResourcesDecode和xxtea四个文件加入到cocos2dx/platform下;

把platform/ResourcesDecode.cpp \
platform/xxtea.c \加入到cocos2dx/platform的android.mk文件中,加入android编译。

写一个单例用来保存密码和对流解密过程,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
CCAssert(buf != NULL, "decodeData buf not NULL" );
 
     unsigned char * buffer = NULL;
     ResourcesDecode* decode = ResourcesDecode::sharedDecode();
     bool isXXTEA = decode && decode->m_xxteaEnabled;
     
     for (unsigned int i = 0; isXXTEA && i < decode->m_xxteaSignLen && i < size; ++i)
     {
         isXXTEA = buf[i] == decode->m_xxteaSign[i];
     }
     
     if (isXXTEA)
     {
         //decrypt XXTEA
         xxtea_long  len = 0;
         buffer = xxtea_decrypt(buf+decode->m_xxteaSignLen, (xxtea_long)size -(xxtea_long)decode->m_xxteaSignLen, (unsigned char *)decode->m_xxteaKey, (xxtea_long)decode->m_xxteaKeyLen, &len);
         delete [] buf;
         buf = NULL;
         size = len;
     }
     else
     {
         buffer = buf;
     }
     
     if (pSize)
     {
         *pSize = size;
     }
     return buffer;




buffer就是经过XXTEA解密后正确的流。

CCFileUtils::getFileData()当中return返回之前调用解密pBuffer =ResourcesDecode::sharedDecode()->decodeData(pBuffer, size, pSize);这里是跨平台的读取资源的方法。

ZipFile::getFileData()当中也加入解密方法pBuffer =ResourcesDecode::sharedDecode()->decodeData(pBuffer, fileInfo.uncompressed_size, pSize);这个是android读取plist的地方,我也不太清楚为什么android会在这里读取资源。

在bool CCSAXParser::parse(const char *pszFile)中把原先的rt改为rb  : char* pBuffer = (char*)CCFileUtils::sharedFileUtils()->getFileData(pszFile,/*"rt"*/"rb", &size);

ios的修改地方 不一样

在CCFileUtilsIOS中的createCCDictionaryWithContentsOfFile修改如下,注释掉的是原先的,后面是新增的。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CCDictionary* CCFileUtilsIOS::createCCDictionaryWithContentsOfFile( const std::string& filename)
{
     std::string fullPath = CCFileUtils::sharedFileUtils()->fullPathForFilename(filename.c_str());
     
//    NSString* pPath = [NSString stringWithUTF8String:fullPath.c_str()];
//    NSDictionary* pDict = [NSDictionary dictionaryWithContentsOfFile:pPath];
     
     unsigned long fileSize = 0;
     unsigned char * pFileData = CCFileUtils::sharedFileUtils()->getFileData(fullPath.c_str(), "rb" , &fileSize);
     NSData *data = [[[NSData alloc] initWithBytes:pFileData length:fileSize] autorelease];
     delete []pFileData;
     NSPropertyListFormat format;
     NSString *error;
     NSMutableDictionary *pDict = (NSMutableDictionary *)[
                                                          NSPropertyListSerialization propertyListFromData:data
                                                          mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                                          format:&format
                                                          errorDescription:&error];





在CCImage.mm当中修改,同样是注释是原先的,后面是新增的。



?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static bool _initWithFile( const char * path, tImageInfo *pImageinfo)
{
     CGImageRef                CGImage;   
     UIImage                    *jpg;
     UIImage                    *png;
     bool            ret;
     
     // convert jpg to png before loading the texture
     
//    NSString *fullPath = [NSString stringWithUTF8String:path];
//    jpg = [[UIImage alloc] initWithContentsOfFile: fullPath];
 
 
unsigned long fileSize = 0;
     unsigned char * pFileData = cocos2d::CCFileUtils::sharedFileUtils()->getFileData(path, "rb" , &fileSize);
     NSData *adata = [[NSData alloc] initWithBytes:pFileData length:fileSize];
     delete []pFileData;
     jpg = [[UIImage alloc] initWithData:adata];




android平台

在CCImageCommon_cpp当中修改如下

?
1
2
3
4
5
6
7
8
bool CCImage::initWithImageFileThreadSafe( const char *fullpath, EImageFormat imageType)
{
     bool bRet = false ;
     unsigned long nSize = 0;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
     CCFileUtilsAndroid *fileUitls = (CCFileUtilsAndroid*)CCFileUtils::sharedFileUtils();
//    unsigned char *pBuffer = fileUitls->getFileDataForAsync(fullpath, "rb", &nSize);
     unsigned char * pBuffer = CCFileUtils::sharedFileUtils()->getFileData(fullpath, "rb" , &nSize);



到此,基本结束了。

在自己程序当中加入资源前把设置密钥和标识和自己加密资源时的一样:ResourcesDecode::sharedDecode()->setXXTeaKey("XXTEA",strlen("XXTEA"),"decodetest",strlen("decodetest"));

其它就正常的读取和显示。

参考网址:http://my.oschina.net/SunLightJuly/blog/184061

http://my.oschina.net/SunLightJuly/blog/189971

http://my.oschina.net/SunLightJuly/blog/184179

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: cocos2d-x是一款流行的开源游戏引擎,它可以用作开发本地移动游戏和桌面游戏。利用cocos2d-x游戏源码,开发人员可以快速构建流畅、高效、具有吸引力的游戏。该引擎使用C ++语言和脚本语言Lua来实现游戏开发,用户可以根据自己的需要进行选择。 cocos2d-x游戏源码包含许多强大的功能和工具,例如精灵、动画、场景管理、碰撞检测和音频控制等。通过这些功能,开发人员可以方便地创建各种类型的游戏,例如动作游戏、射击游戏、冒险游戏和益智游戏等。 此外,cocos2d-x游戏源码还具有高度定制化的特性,允许开发人员根据他们的需求自定义游戏元素。这种定制化可以通过改进游戏画面,添加新的模式和关卡,甚至整个新的游戏玩法来完成。 总之,cocos2d-x游戏源码是一款功能强大、易于使用和高度定制的游戏引擎,它可以帮助开发人员快速开发各种类型的游戏。无论你是专业开发人员还是无经验的游戏制作者,cocos2d-x都是一个极好的选择。 ### 回答2: Cocos2d-x游戏源码是使用Cocos2d-x引擎进行开发的游戏程序代码。Cocos2d-x引擎是一个开源的跨平台游戏引擎,可以支持iOS、Android、Windows Phone、Windows、MacOS和Linux等多个平台,并且提供了丰富的游戏开发API和工具集。Cocos2d-x游戏源码包含了游戏的核心逻辑、UI设计、动画效果、音频效果等各方面的代码,可以作为开发者学习和借鉴的重要资料。 由于Cocos2d-x引擎支持多种编程语言(如C++、Lua等),因此Cocos2d-x游戏源码也会有对应的编程语言版本。开发者可以通过阅读Cocos2d-x游戏源码,了解游戏开发过程中的技术细节,学习如何使用Cocos2d-x引擎进行游戏开发。同时,开发者也可以通过对Cocos2d-x游戏源码进行修改和优化,来满足游戏的特定需求,提升游戏的性能和用户体验。 总之,Cocos2d-x游戏源码是游戏开发者必备的重要资源,可以帮助开发者更好地了解游戏开发技术,提升游戏开发水平。 ### 回答3: cocos2d-x是一款优秀的游戏开发引擎,其源码包含了许多功能强大的游戏开发工具和API。使用cocos2d-x可以帮助开发者更快速更高效地开发出优秀的游戏作品。 cocos2d-x的游戏源码非常丰富,其包含了许多不同类型的游戏示例和模板,如平面射击、塔防、解谜等,这些示例可以帮助开发者更好地了解cocos2d-x的使用方法和原理。 cocos2d-x的源码还包含了许多强大的API和工具,例如场景管理、动画控制、音频引擎等,这些工具和API能够帮助开发者更好地完成游戏的开发和调试。 此外,cocos2d-x的源码还提供了完整的游戏开发框架,包括资源管理、内存管理、事件机制等,这些框架可以帮助开发者更好地组织代码和提高代码的可维护性。 总的来说,cocos2d-x游戏源码提供了丰富的工具和API,可以帮助开发者更高效地进行游戏开发,大大降低了开发难度和成本,是一款非常适合游戏开发者使用的引擎。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值