天天看點

【iOS-cocos2d-X 遊戲開發之六】使用Base64算法對Cocos2dX自帶CCUserDefault遊戲存儲資料加密!

上一篇介紹了,如何使用Cocos2dX自帶的CCUserDefault 存儲遊戲資料,那麼Himi也提到此方式儲存的為xml格式并且資料明文顯示=。 =,這個對于我們開發者來說太暴漏了有木有! so~本篇Himi分享如何使用經典Base64算法對CCUserDefault進行資料加密!

OK,關于base64的介紹,Himi不再贅述,還不太熟悉的童鞋請點選以下連接配接閱讀:

如果對于Cocos2dX自帶的CCUserDefault類不太熟悉的請點選如下連接配接:

<a href="http://www.himigame.com/iphone-cocos2dx/653.html" target="_blank">【iOS-cocos2d-X 遊戲開發之五】遊戲存儲之Cocos2dX自帶CCUserDefault類詳解;</a>

對Base64有了基礎認識後我們就開始進入正題,首先,我們針對Cocos2dX使用c++版的base64加密檔案:

base64.h以及base64.cpp  檔案下載下傳導入項目中:

然後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&lt;const unsigned char*&gt;(sValue.c_str()), sValue.length()); 

    CCLog("存儲加密後的資料 key:index: Himi%i, value: %s  ",iKey,sKey.c_str()); 

    CCUserDefault::sharedUserDefault()-&gt;setStringForKey(buffer, sKey); 

    CCUserDefault::sharedUserDefault()-&gt;flush(); 

//讀取 

int HelloWorld::loadDataByKey(int iKey){ 

    CCLog("----------讀取"); 

    string s = CCUserDefault::sharedUserDefault()-&gt;getStringForKey(buffer); 

    CCLog("解密前的資料: %s  ",s.c_str()); 

    string parseKey = himiParseData(s); 

    CCLog("解密後的資料: %s  ",parseKey.c_str()); 

    return atoi(parseKey.c_str()); 

OK,這裡開始逐漸解釋一下:

首先說下備注2,這裡定義的兩個方法,第一個函數:

1

2

<code>//存儲資料</code>

<code>    </code><code>void</code> <code>saveDataByKeyValue(</code><code>int</code> <code>iKey, string sValue);</code>

其中第一個函數傳入一個int值,為什麼要這樣,原因是這樣友善與結合枚舉變量(備注1)來進行存儲,這樣使用的時候非常簡化你的代碼和步驟;第二個函數是值,這裡我封裝成string,這樣為了更好的結合我們的base64加密!這點在(備注3)中展現!

第二個函數:

<code>//讀取資料</code>

<code>    </code><code>int</code> <code>loadDataByKey(</code><code>int</code> <code>iKey);</code>

這個函數沒什麼好說的,傳入的參數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”,大家不喜歡可以換成自己喜歡的,但是千萬不要删除!因為一旦你删除掉,然後将存儲後的形式為: &lt;1&gt;資料&lt;/1&gt;  這樣會造成你讀取資料出錯!

讀取資料步驟:根據key讀取xml的加密過的string,然後base64解密出原始值,最終atoi轉化成int扔出!

這其中應該說沒什麼難于了解的,是以這裡不再贅述了;

那麼下面我們來看這兩個函數如何使用:

//base64加密存儲 

this-&gt;saveDataByKeyValue(DATA_GOLD, "10000"); 

//base64讀取資料 

this-&gt;loadDataByKey(DATA_GOLD); 

代碼是不是用起來很方面呢!哈哈,這就對啦,不能因為加密弄得亂78糟~OK,運作項目,控制台你将看到如下顯示:

Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0 

Cocos2d: cocos2d: GL_VENDOR:     Imagination Technologies 

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 in TextureAtlas : NO 

Cocos2d: 此項目已存在儲存資料的xml檔案 

Cocos2d: 存儲之前資料 key:index: 0, value: 10000 

Cocos2d: 存儲加密後的資料 key:index: 0, value: MTAwMDA= 

Cocos2d: 解密前的資料: MTAwMDA= 

Cocos2d: 解密後的資料: 10000 

存儲的檔案内容截圖如下:

<a href="http://www.himigame.com/wp-content/uploads/2012/03/1232.png"></a>

OK,最後呢,我要說一點,雖然我們使用base64可以對資料進行加密,但是對于不懂程式的使用者來說基本無法修改,但是對于稍微有了解base64加密的童鞋,那麼直接可以線上解碼你的這個加密,是以呢!最後Himi提醒大家,使用base64當中,大家可以書寫一些算法結合base64來使用!這樣即使明文也不怕,至于怎麼做,Himi就不再多說了 哈哈!

本篇源碼下載下傳:

本文轉自 xiaominghimi 51CTO部落格,原文連結:http://blog.51cto.com/xiaominghimi/817095,如需轉載請自行聯系原作者

繼續閱讀