【iOS-cocos2d-X 游戏开发之六】使用Base64算法对Cocos2dX自带CCUserDefault游戏存储数据加密!

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

上一篇介绍了,如何使用Cocos2dX自带的CCUserDefault 存储游戏数据,那么Himi也提到此方式保存的为xml格式并且数据明文显示=。 =,这个对于我们开发者来说太暴漏了有木有! so~本篇Himi分享如何使用经典Base64算法对CCUserDefault进行数据加密!

OK,关于base64的介绍,Himi不再赘述,还不太熟悉的童鞋请点击以下连接阅读:

http://baike.baidu.com/view/469071.htm (百度百科的 base64详细解释)

如果对于Cocos2dX自带的CCUserDefault类不太熟悉的请点击如下连接:

【iOS-cocos2d-X 游戏开发之五】游戏存储之Cocos2dX自带CCUserDefault类详解;

对Base64有了基础认识后我们就开始进入正题,首先,我们针对Cocos2dX使用c++版的base64加密文件:

base64.h以及base64.cpp  文件下载导入项目中:

  DataBase64Himi.zip (647 字节, 11 次)

 

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

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


    
    
  1. enum
  2.     DATA_GOLD,//金币 
  3.   
  4. }; 

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


  
  
  1. //存储数据 
  2. void saveDataByKeyValue(int iKey, string sValue); 
  3.   
  4. //读取数据 
  5. int loadDataByKey(int iKey); 

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


  
  
  1. //存储 
  2. void HelloWorld::saveDataByKeyValue(int iKey, string sValue){ 
  3.     char buffer[32]; 
  4.     sprintf(buffer, "%s%d""Himi",iKey); 
  5.     CCLog("----------存储"); 
  6.     CCLog("存储之前数据 key:index: Himi%i, value: %s  ",iKey,sValue.c_str()); 
  7.     string sKey = himiSaveData(reinterpret_cast<const unsigned char*>(sValue.c_str()), sValue.length()); 
  8.     CCLog("存储加密后的数据 key:index: Himi%i, value: %s  ",iKey,sKey.c_str()); 
  9.     CCUserDefault::sharedUserDefault()->setStringForKey(buffer, sKey); 
  10.     CCUserDefault::sharedUserDefault()->flush(); 
  11.   
  12. //读取 
  13. int HelloWorld::loadDataByKey(int iKey){ 
  14.     CCLog("----------读取"); 
  15.     char buffer[32]; 
  16.     sprintf(buffer, "%s%d""Himi",iKey); 
  17.   
  18.     string s = CCUserDefault::sharedUserDefault()->getStringForKey(buffer); 
  19.     CCLog("解密前的数据: %s  ",s.c_str()); 
  20.     string parseKey = himiParseData(s); 
  21.     CCLog("解密后的数据: %s  ",parseKey.c_str()); 
  22.     return atoi(parseKey.c_str()); 

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

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

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

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

第二个函数:

1
2
//读取数据
     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扔出!

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

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


  
  
  1. //base64加密存储 
  2. this->saveDataByKeyValue(DATA_GOLD, "10000"); 
  3.   
  4. //base64读取数据 
  5. this->loadDataByKey(DATA_GOLD); 

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


  
  
  1. Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0 
  2. Cocos2d: cocos2d: GL_VENDOR:     Imagination Technologies 
  3. Cocos2d: cocos2d: GL_RENDERER:   PowerVR SGX 543 
  4. Cocos2d: cocos2d: GL_VERSION:    OpenGL ES-CM 1.1 IMGSGX543-63.14.2 
  5. Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 4096 
  6. Cocos2d: cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH: 16 
  7. Cocos2d: cocos2d: GL supports PVRTC: YES 
  8. Cocos2d: cocos2d: GL supports BGRA8888 textures: NO 
  9. Cocos2d: cocos2d: GL supports NPOT textures: YES 
  10. Cocos2d: cocos2d: GL supports discard_framebuffer: YES 
  11. Cocos2d: cocos2d: compiled with NPOT support: NO 
  12. Cocos2d: cocos2d: compiled with VBO support in TextureAtlas : NO 
  13. Cocos2d: 此项目已存在保存数据的xml文件 
  14. Cocos2d: 存储之前数据 key:index: 0, value: 10000 
  15. Cocos2d: 存储加密后的数据 key:index: 0, value: MTAwMDA= 
  16. Cocos2d: 解密前的数据: MTAwMDA= 
  17. Cocos2d: 解密后的数据: 10000 

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

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





本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/817095,如需转载请自行联系原作者

目录
相关文章
|
5月前
|
算法 Java 数据处理
Java中MD5加密算法的实现
Java中MD5加密算法的实现
|
1月前
|
人工智能 算法 Java
【搜索算法】数字游戏(C/C++)
【搜索算法】数字游戏(C/C++)
|
3月前
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
138 1
|
3月前
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点展示了如何使用 Kotlin 实现 AES-256 的加密和解密,提供了详细的代码示例。
77 2
|
3月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
295 1
|
3月前
|
算法 JavaScript 前端开发
消息摘要算法:MD5加密
消息摘要算法:MD5加密
61 1
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
50 1
|
3月前
|
算法
互动游戏解决遇到问题之基于射线投射寻路算法的问题如何解决
互动游戏解决遇到问题之基于射线投射寻路算法的问题如何解决
|
3月前
|
算法 Python
【python】python基于 Q-learning 算法的迷宫游戏(源码+论文)【独一无二】
【python】python基于 Q-learning 算法的迷宫游戏(源码+论文)【独一无二】
|
4月前
|
存储 算法 安全
网络安全中的加密技术与解密算法:保障数据安全的基石
【7月更文挑战第1天】网络安全依赖加密技术与解密算法确保数据安全。本文探讨加密原理、对称与非对称加密(如AES、DES、RSA、ECC)及它们在数据传输、存储安全和身份验证中的应用。加密是数据保密的核心,面对不断升级的网络威胁,加密技术将持续进化以适应新挑战。
下一篇
无影云桌面