欢迎光临Software MyZone,有问题可留言或到站点论坛发帖,争取第一时间帮忙解决 || 站点论坛:火龙论坛 || 淘宝小店:应小心的易淘屋 【欢迎大家提建设性意见】

CCUserDefault加密

本文为firedragonpzy原创,转载务必在明显处注明:
转载自【Softeware MyZone】原文链接: 
http://www.firedragonpzy.com.cn/index.php/archives/3049

欢迎热爱编程的朋友们参与到cocos2d-x编程中,为了给大家提供良好的交流环境,网站以开启QQ群
Software MyZone:66202765(群号,欢迎加入,若满,请加1群)
Software MyZone 1群(2dx):286504621
【加群请写:Software MyZone或者是firedragonpzy】
群论坛:火龙论坛正试运营阶段,欢迎大家多提些建设性意见……

最近项目需求,部分数据的存储在xml,需要进行加密,我就简单封装了一下方法,不尽人意之处,大家多多指教:

以下是他们给的加密文件:

DataBase64.h


#ifndef DATABASE64_H_
#define DATABASE64_H_

#include <string>

std::string SaveData(unsigned char const* , unsigned int len);
std::string ParseData(std::string const& s);

#endif /* DATABASE64_H_ */

DataBase64.cpp


#include "DataBase64.h"
static const std::string dataChars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";

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

std::string SaveData(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 ParseData(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;
}

因为数据的存储与读取经常用,我就将其封装到了我的工具类中,封装如下:


static int getIntegerForKey(const char* pKey)
 {
 std::string key = pKey;
 key = SaveData(reinterpret_cast<const unsigned char*>(key.c_str()), key.length());
 std::string data = CCUserDefault::sharedUserDefault()->getStringForKey(key.c_str());
 //std::string data = CCUserDefault::sharedUserDefault()->getStringForKey(pKey);//注释后,使用键值加密,开启,注释上句使用值加密
 data = ParseData(data);
 CCString *str = CCString::create(data);
 return str->intValue();
 }

 static void setIntegerForKey(const char* pKey, int value)
 {
 char buffer[50];
 sprintf(buffer,"%d",value);
 std::string data = buffer;
 std::string key = pKey;
 data = SaveData(reinterpret_cast<const unsigned char*>(data.c_str()), data.length());
 key = SaveData(reinterpret_cast<const unsigned char*>(key.c_str()),key.length());
 CCUserDefault::sharedUserDefault()->setStringForKey(key.c_str(), data);
//CCUserDefault::sharedUserDefault()->setStringForKey(pKey, data);//注释后,使用键值加密,开启,注释上句使用值加密
 CCUserDefault::sharedUserDefault()->flush();
 }

当然这里我只是封装了setIntegerForKey这个方法,其余的什么float原理是一样的,你只需要把getFloatForKey中的return str->intValue();改为return str->floatValue();即可。

因为我封装的方法表面试int型,实际存储的还是string类型的,呵呵,不多说……