`

Base64算法对Cocos2dX自带CCUserDefault游戏存储数据编码加密

 
阅读更多

对Cocos2dX使用c++版的base64编码文件:

#include "DataBase64Himi.h"


static const std::string dataChars = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";

static inline bool baseData(unsigned char c) {
    return (isalnum(c) || (c == '+') || (c == '/'));
}

std::string himiSaveData(unsigned char const* bytes_to_encode, unsigned int in_len) {
    std::string ret;
    int i = 0;
    int j = 0;
    unsigned char char_array_3[3];
    unsigned char char_array_4[4];
    
    while (in_len--) {
        char_array_3[i++] = *(bytes_to_encode++);
        if (i == 3) {
            char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
            char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
            char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
            char_array_4[3] = char_array_3[2] & 0x3f;
            
            for(i = 0; (i <4) ; i++)
                ret += dataChars[char_array_4[i]];
            i = 0;
        }
    }
    
    if (i)
    {
        for(j = i; j < 3; j++)
            char_array_3[j] = '\0';
        
        char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
        char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
        char_array_4[3] = char_array_3[2] & 0x3f;
        
        for (j = 0; (j < i + 1); j++)
            ret += dataChars[char_array_4[j]];
        
        while((i++ < 3))
            ret += '=';
        
    }
    
    return ret;
    
}

std::string himiParseData(std::string const& encoded_string) {
    int in_len = encoded_string.size();
    int i = 0;
    int j = 0;
    int in_ = 0;
    unsigned char char_array_4[4], char_array_3[3];
    std::string ret;
    
    while (in_len-- && ( encoded_string[in_] != '=') && baseData(encoded_string[in_])) {
        char_array_4[i++] = encoded_string[in_]; in_++;
        if (i ==4) {
            for (i = 0; i <4; i++)
                char_array_4[i] = dataChars.find(char_array_4[i]);
            
            char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
            char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
            char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
            
            for (i = 0; (i < 3); i++)
                ret += char_array_3[i];
            i = 0;
        }
    }
    
    if (i) {
        for (j = i; j <4; j++)
            char_array_4[j] = 0;
        
        for (j = 0; j <4; j++)
            char_array_4[j] = dataChars.find(char_array_4[j]);
        
        char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
        char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
        char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
        
        for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
    }
    
    return ret;
}

 

然后Himi封装好了两个函数:(这里我们假设存储游戏金币)

首先.h中,定义枚举变量(备注1)

enum{
    DATA_GOLD,//金币
 
};

 

然后.h定义两个函数:(备注2)

 

    //存储数据
    void saveDataByKeyValue(int iKey, string sValue);
    
    //读取数据
    int loadDataByKey(int iKey);
 

 

最后.cpp中函数具体实现代码:(备注3)

//存储
void HelloWorld::saveDataByKeyValue(int iKey, string sValue){ 
    char buffer[32];
    sprintf(buffer, "%s%d", "Himi",iKey);
    CCLog("----------存储");
    CCLog("存储之前数据 key:index: Himi%i, value: %s  ",iKey,sValue.c_str());
    string sKey = himiSaveData(reinterpret_cast<const unsigned char*>(sValue.c_str()), sValue.length());
    CCLog("存储加密后的数据 key:index: Himi%i, value: %s  ",iKey,sKey.c_str());
    CCUserDefault::sharedUserDefault()->setStringForKey(buffer, sKey);
    CCUserDefault::sharedUserDefault()->flush();
}

//读取
int HelloWorld::loadDataByKey(int iKey){
    CCLog("----------读取");
    char buffer[32];
    sprintf(buffer, "%s%d", "Himi",iKey);
    
    string s = CCUserDefault::sharedUserDefault()->getStringForKey(buffer);
    CCLog("解密前的数据: %s  ",s.c_str());
    string parseKey = himiParseData(s);
    CCLog("解密后的数据: %s  ",parseKey.c_str());
    return atoi(parseKey.c_str());
}
 

OK,这里开始逐步解释一下:

首先说下备注2,这里定义的两个方法,第一个函数:

//存储数据
void saveDataByKeyValue(int iKey, string sValue);

其中第一个函数传入一个int值,为什么要这样,原因是这样方便与结合枚举变量(备注1)来进行存储,这样使用的时候非常简化你的代码和步骤;第二个函数是值,这里我封装成string,这样为了更好的结合我们的base64编码!这点在(备注3)中体现!

第二个函数:

//读取数据
int loadDataByKey(int iKey);

这个函数没什么好说的,传入的参数int,枚举变量即可!至于返回值是int 是方便程序中使用!

OK,那么备注3对于两个封装函数中的实现需要说明的有3点:

1.  将传入的int值(key)转化成char*类型,因为cocos2dx中并没有itoa这样的方法(原因上一篇有介绍),所以这里我采用   char buffer[32];    sprintf(buffer, “%s%d”, “Himi”,iKey);  方式进行将int转化char*类型;

2. 存储的时候我们步骤是:string值进行base64编码,然后存储到xml中;

3. 将int转化string的时候我在枚举变量前加入”Himi”,大家不喜欢可以换成自己喜欢的,但是千万不要删除!因为一旦你删除掉,然后将存储后的形式为: <1>数据</1>  这样会造成你读取数据出错!

读取数据步骤:根据key读取xml的编码过的string,然后base64解码出原始值,最终atoi转化成int扔出!

这其中应该说没什么难于理解的,所以这里不再赘述了;

那么下面我们来看这两个函数如何使用:

//base64编码存储
this->saveDataByKeyValue(DATA_GOLD, "10000");
 
//base64读取数据
this->loadDataByKey(DATA_GOLD);

代码是不是用起来很方面呢!哈哈,这就对啦,不能因为编码弄得乱78糟~OK,运行项目,控制台你将看到如下显示:

Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0
Cocos2d: cocos2d: GL_VENDOR:     ImaginationTechnologies
Cocos2d: cocos2d: GL_RENDERER:   PowerVR SGX 543
Cocos2d: cocos2d: GL_VERSION:    OpenGL ES-CM 1.1 IMGSGX543-63.14.2
Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE:4096
Cocos2d: cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH:16
Cocos2d: cocos2d: GL supports PVRTC:YES
Cocos2d: cocos2d: GL supports BGRA8888 textures:NO
Cocos2d: cocos2d: GL supports NPOT textures:YES
Cocos2d: cocos2d: GL supports discard_framebuffer:YES
Cocos2d: cocos2d: compiled with NPOT support:NO
Cocos2d: cocos2d: compiled with VBO support inTextureAtlas:NO
Cocos2d:此项目已存在保存数据的xml文件
Cocos2d:存储之前数据 keyindex:0, value:10000
Cocos2d:存储编码后的数据 keyindex:0, value:MTAwMDA=
Cocos2d:解码前的数据:MTAwMDA=
Cocos2d:解码后的数据:10000

存储的文件内容截图如下:

OK,最后呢,我要说一点,虽然我们使用base64可以对数据进行编码,但是对于不懂程序的用户来说基本无法修改,但是对于稍微有了解 base64编码的童鞋,那么直接可以在线解码你的这个编码,所以呢!最后Himi提醒大家,使用base64当中,大家可以书写一些算法结合 base64来使用!这样即使明文也不怕,至于怎么做,Himi就不再多说了 哈哈!

 

分享到:
评论

相关推荐

    cocos2d-x 3.X 接收图片 base64 转码显示

    在cocos2d-x 3.x版本中,处理网络接收的Base64编码的图片数据并将其显示在精灵(Sprite)上是一项常见的任务。这通常涉及到网络请求、数据解码以及图像渲染等多个步骤。以下是详细的知识点说明: 1. **Base64编码**:...

    cocos2dx 用户数据加密

    总的来说,Cocos2d-x用户数据加密是一个涉及加密算法、数据编码以及持久化存储的过程。通过正确地实现这一过程,可以有效地保护游戏中的用户数据,增强应用的安全性。在实际开发中,还需要注意遵循各种平台的安全...

    cocos2dx3.x游戏开发之旅电子版

    《Cocos2d-x 3.x游戏开发之旅》是一本深度探讨Cocos2dx 3.x框架的游戏开发专著,适合对游戏编程有兴趣并有一定基础的开发者。Cocos2dx是一个开源的游戏开发框架,它基于C++,同时支持多种语言,如Lua和JavaScript,...

    cocos2dx资源加密与压缩

    1. XXTEA算法原理:XXTEA使用四轮加密过程,通过对数据进行加法、异或和位移操作,实现数据的加密。它需要两个密钥参数,通过密钥与数据交互完成加密。 2. 在C++中的实现:`xxtea.cpp`和`xxtea.h`文件包含了XXTEA...

    cocos2dx js资源及脚本加密工具源码

    本文将详细讲解如何利用XXTEA算法对Cocos2dx中的JS资源和脚本进行加密,以及加密过程中的关键步骤和注意事项。 **XXTEA算法简介** XXTEA(Xexed TEA)是一种快速且安全的块加密算法,由David Wheeler和Ross J. ...

    cocos2dx 游戏开发系列之三 源码

    《cocos2dx游戏开发系列之三:源码解析与Android工程构建》 在游戏开发领域,cocos2dx是一个广泛使用的开源游戏引擎,尤其在跨平台开发中扮演着重要角色。本篇将深入探讨cocos2dx游戏开发系列的第三部分——源码...

    基于cocos2dx的一个小例子

    Cocos2dx是一个开源的游戏开发框架,它基于C++,并提供对多种编程语言的支持,包括Lua和JavaScript。本实例以"基于cocos2dx的一个小例子"为主题,展示了如何利用Cocos2dx进行游戏开发的基本流程,涵盖了人物行走、...

    Cocos2dx-2.2.3 A星寻路算法源码

    Cocos2dx是一款开源的游戏开发框架,主要用于创建2D和3D游戏,它基于C++,并且提供了多种语言接口,包括Lua和JavaScript。版本2.2.3是该框架的一个历史版本,它在游戏开发社区中广泛使用,因为它提供了丰富的功能和...

    cocos2dx单机大富翁游戏源码

    “cocos2dx单机大富翁游戏源码”是一个基于cocos2dx框架开发的休闲娱乐游戏项目,旨在为开发者提供一个学习和参考的实例,帮助他们理解和掌握cocos2dx引擎在实际游戏开发中的应用。下面,我们将深入探讨cocos2dx框架...

    cocos2dx 3.2做的一款赛车游戏

    《cocos2dx 3.2制作的赛车游戏详解》 Cocos2dx是一款流行的开源游戏开发框架,基于C++,支持多平台开发,包括iOS、Android、Windows等。在cocos2dx 3.2版本中制作的赛车游戏,充分利用了这个框架的优势,为玩家提供...

    cocos2dx斗地主服务端,客户端在我的资源列表中

    在游戏开发领域,Cocos2dx是一款广泛使用的开源游戏引擎,它基于C++,并提供了对多种平台的支持,包括iOS。本资源包含了斗地主游戏的服务端和客户端代码,这为我们提供了一个深入理解如何构建一款跨平台游戏的机会。...

    cocos2dx 游戏源码

    这个压缩包文件包含了"Cocos2dx 游戏源码",特别是针对一款名为"蜗蜗回家"的游戏。这款游戏同时适用于Android和iOS平台,意味着它利用了Cocos2d-x跨平台的能力。 Cocos2d-x是Cocos2d-x项目的早期版本,基于C++编写...

    cocos2dx-2.x播放mp4

    在Cocos2dx 2.x版本中播放MP4格式的视频文件是一项常见的需求,尤其是在开发游戏或者多媒体应用时。Cocos2dx是一个基于C++的游戏开发框架,它提供了丰富的功能来帮助开发者创建2D和3D游戏。在这个场景中,我们将深入...

    Cocos2dx开源游戏-光线迷宫

    《Cocos2dx开源游戏-光线迷宫》是一款基于Cocos2dx游戏引擎开发的迷宫探索类游戏,它借鉴了iOS平台上的类似玩法,为玩家带来富有挑战性的游戏体验。Cocos2dx是一个广受欢迎的开源游戏开发框架,以其高效、易用和跨...

    基于Cocos2dx的炸弹人游戏

    【基于Cocos2dx的炸弹人游戏】是一个利用Cocos2dx框架开发的、采用C++编程语言实现的经典游戏项目。Cocos2dx是一个开源的游戏开发框架,它以C++作为主要的编程语言,同时也支持Lua和JavaScript。该框架以其高效、跨...

    cocos2dx 3.4 拼图游戏 源代码及运行文件

    《cocos2dx 3.4 拼图游戏源代码及运行文件》是一个基于Cocos2d-x 3.4版本开发的拼图游戏项目,它提供了完整的源代码和可执行文件,让开发者和游戏爱好者能够深入学习和研究游戏开发的实践技巧。这个游戏包含了四关,...

    Cocos2d-x CCUserDefault 实现简单数据存储

    利用CCUserDefault 的存储功能,实现判断程序是否是第一次运行。相关文章请参考博客:http://blog.csdn.net/u012945598/article/category/1764935

    Cocos2DX.手机游戏开发

    手游开发引擎 Cocos2DX.手机游戏开发

    cocos2dx 工具之CocosBuilder

    Cocos2dx是一个广泛使用的开源游戏开发框架,基于C++,支持跨平台的游戏开发,适用于iOS、Android、Windows等多个平台。在Cocos2dx的生态系统中,有一系列强大的辅助工具,大大提升了开发效率,其中CocosBuilder就是...

    cocos2dx 2048游戏源码

    本文将深入探讨使用cocos2dx框架开发的2048游戏源码,帮助读者理解cocos2dx引擎的运用以及2048游戏的核心算法。 cocos2dx是一款开源的游戏开发框架,基于C++,它提供了丰富的2D和3D图形功能,使得开发者能够高效地...

Global site tag (gtag.js) - Google Analytics