TEA加密/解密算法

在遊戲項目中,通常須要對資源或數據進行加密保護,最簡單高效的加密算法就是採用位與或之類的,可是比較容易被人分析出來。
TEA加密算法不但比較簡單,並且有很強的抗差分分析能力,加密速度也比較快。能夠根據項目需求設置加密輪數來增長加密強度。
1.加密核心函數算法

 1 void EncryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key)  2 {  3     unsigned int y = *firstChunk;  4     unsigned int z = *secondChunk;  5     unsigned int sum = 0;  6 
 7     unsigned int delta = 0x9e3779b9;  8 
 9     for (int i = 0; i < 8; i++)//8輪運算(須要對應下面的解密核心函數的輪數同樣)
10  { 11         sum += delta; 12         y += ((z << 4) + key[0]) ^ (z + sum) ^ ((z >> 5) + key[1]); 13         z += ((y << 4) + key[2]) ^ (y + sum) ^ ((y >> 5) + key[3]); 14  } 15 
16     *firstChunk = y; 17     *secondChunk = z; 18 }

2.解密核心函數windows

 1 void DecryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key)  2 {  3     unsigned int  sum = 0;  4     unsigned int  y = *firstChunk;  5     unsigned int  z = *secondChunk;  6     unsigned int  delta = 0x9e3779b9;  7 
 8     sum = delta << 3; //32輪運算,因此是2的5次方;16輪運算,因此是2的4次方;8輪運算,因此是2的3次方
 9 
10     for (int i = 0; i < 8; i++) //8輪運算
11  { 12         z -= (y << 4) + key[2] ^ y + sum ^ (y >> 5) + key[3]; 13         y -= (z << 4) + key[0] ^ z + sum ^ (z >> 5) + key[1]; 14         sum -= delta; 15  } 16 
17     *firstChunk = y; 18     *secondChunk = z; 19 }

3.封裝對輸入數據進行加密函數緩存

 1 //buffer:輸入的待加密數據buffer,在函數中直接對元數據buffer進行加密;size:buffer長度;key是密鑰;
 2 void EncryptBuffer(char* buffer, int size, unsigned int* key)  3 {  4     char *p = buffer;  5 
 6     int leftSize = size;  7 
 8     while (p < buffer + size &&
 9         leftSize >= sizeof(unsigned int) * 2) 10  { 11         EncryptTEA((unsigned int *)p, (unsigned int *)(p + sizeof(unsigned int)), key); 12         p += sizeof(unsigned int) * 2; 13 
14         leftSize -= sizeof(unsigned int) * 2; 15  } 16 }

4.封裝對加密數據進行解密函數函數

 1 //buffer:輸入的待解密數據buffer,在函數中直接對元數據buffer進行解密;size:buffer長度;key是密鑰;
 2 void DecryptBuffer(char* buffer, int size, unsigned int* key)  3 {  4     char *p = buffer;  5 
 6     int leftSize = size;  7 
 8     while (p < buffer + size &&
 9         leftSize >= sizeof(unsigned int) * 2) 10  { 11         DecryptTEA((unsigned int *)p, (unsigned int *)(p + sizeof(unsigned int)), key); 12         p += sizeof(unsigned int) * 2; 13 
14         leftSize -= sizeof(unsigned int) * 2; 15  } 16 }

5.測試加密/解密文件例子(windows下)測試

 1 //-----設置密鑰,必須須要16個字符或以上(這裏的長度錯誤由評論#3樓legion提出修正,表示感謝。)
 2 unsigned int *key = (unsigned int *)"testkey123456789";  3 //-----讀取文件
 4 unsigned int pSize = 0;  5 char * pBuffer = NULL;  6 FILE *fp;  7 int err = fopen_s(&fp, sFileName, "rb"); //sFileName是讀取的加密/解密文件名 TODO:處理錯誤
 8 fseek(fp, 0, SEEK_END);  9 pSize = ftell(fp); //獲得長度
10 fseek(fp, 0, SEEK_SET); 11 pBuffer = new char[pSize]; //開闢內存空間
12 pSize = fread(pBuffer, sizeof(char), pSize, fp); //讀取內容
13 fclose(fp); //關閉文件 14 
15 //-----對原始文件進行加密
16 EncryptBuffer(pBuffer, pSize, key); 17 
18 //若是是已經加密過的文件,則對應爲解密函數 19 //DecryptBuffer(pBuffer, pSize, key); 20 
21 //-----將數據寫入文件當中
22 FILE *fDestFile; 23 fopen_s(&fDestFile, sTagetFileName, "wb"); //sTagetFileName是寫入的加密/解密文件名
24 fwrite(pBuffer, sizeof(char), pSize, fDestFile); 25 fclose(fDestFile);//關閉文件
26 
27 delete[]pBuffer;

 

 

PS:加密

1.對於cocos2d來講,使用pvr或者pvr.ccz等方式也是能加密的,可是在引擎內部進行解密的時候須要開闢一塊內存空間進行解密,會提升遊戲對內存的需求。因此,直接對讀入內存中的文件緩存進行解密能夠避免這種狀況的發生。spa

2.在cocos2d-x-3.10\cocos\base裏的base64.h & base64.cpp文件裏,實現了base64的加解base64Encode/解密base64Decode方法。code

相關文章
相關標籤/搜索