1. 程式人生 > >對檔案進行異或加解密的方法

對檔案進行異或加解密的方法

資源加密實際上是對遊戲所用到的資源進行二進位制碼的轉換,這樣別人就無法獲取到正確的資源。

在遊戲進行的時候通過對資源的解碼來獲取正確的資源,然後進行顯示。

首先用於加密的演算法必須可以進行解密,不然的話就無法進行資源的載入了。

cocos2d-x資源加密和解密(一) - 鵲起驚風 - 雀巢

資源的加密:
資源的加密過程並不需要在程式碼裡面寫,最好可以用一個工具直接進行批量加密,而且為了演算法

的保密性,最好還是自己單獨寫個加密演算法,用公開的演算法加密的話很容易被人破解。

這裡以最簡單的異或加密來說:

異或的運算方法是一個二進位制運算:
1^1=0
0^0=0
1^0=1
0^1=1

兩者相等為0,不等為1.

對於一個字元來說,都可以用二進位制碼來表示.如A:01000001
字元的異或就是對每一位進行二進位制運算.

用於加密演算法時,假設你要加密的內容為A,金鑰為B,則可以用異或加密:
C=A^B
在資料中儲存C就行了.
用的時候:
A=B^C
即可取得原加密的內容,所以只要知道金鑰,就可以完成加密和解密.

加密工具製作:這裡使用C#的winform來製作(一直沒用C#,都快忘了,用了一天才搞出來)

cocos2d-x資源加密和解密(一) - 鵲起驚風 - 雀巢

首先需要遞迴遍歷所有的資料夾找出其中和正則表示式符合的檔案,
cocos2d-x資源加密和解密(一) - 鵲起驚風 - 雀巢

當遍歷完成之後,所有的檔案的全路徑也都記錄了下來,那麼就可以直接獲取檔案的二進位制資料了。
通過 File.ReadAllBytes(fileName);方法可以獲取該檔案的所有位元組碼。

   既然要做的是個加密的工具,所以必須要考慮到各種人為的情況。

   1、檔案只有沒加密的情況下才能進行加密。

   2、檔案之後再加密的情況下才能進行解密。

   3、必須能夠判斷金鑰是否正確,因為如果用一個假的金鑰進行解密的話會將原本的資料毀掉。

   4、遞迴加密的時候必須能夠忽略掉那些已經加密的檔案,解密的時候忽略掉那些沒有加密的檔案。

要做到上面1、2倆要求,就必須要能夠判斷出來,什麼時候檔案是加密的,什麼時候檔案是解密的。

cocos2d-x資源加密和解密(一) - 鵲起驚風 - 雀巢

  針對1、2情況,可以通過在原始資料的前面加入一段名叫檔案頭的位元組片段用來標識一個檔案是否被加密過的。這樣就可以識別是否進行過加密。

  但是由於某些情況,比如記得多個金鑰忘了是哪個了,需要多試幾次,或者手誤輸錯了一個符號,那麼就

會導致將資料直接解析錯,檔案全毀了,而且無法恢復。

 針對這種情況,需要對檔案頭進行一些修改,可以將檔案頭分為兩個部分。

cocos2d-x資源加密和解密(一) - 鵲起驚風 - 雀巢

其中prefixed用來識別是否加密過,dataHeader和資料部分一塊進行異或加密,這樣在解密出資料的時候

只需要判斷dataHeader是否和檔案解密出來的dataHeader部分一樣,這樣就可以判斷當前金鑰是否正確,

如果是個錯誤的金鑰,那麼進行解密之後其檔案的dataHeader部分和原始的dataHeader相同的機率幾乎為0.

經過以上這些步驟,製作的工具可以防止多次加密,多次解密、金鑰錯誤、未加密的時候解密的情況。

 由於在遞迴的過程中,可以選擇性的忽略某些檔案,比如說現在要對一個資料夾下的所有檔案進行加密,但是其中有一部分已經是加密過的了,總不能將加密過的拿出來再對資料夾進行解密吧,那樣豈不是很麻煩,所以能夠針對單個檔案進行忽略直接跳入下一個檔案。

cocos2d-x資源加密和解密(一) - 鵲起驚風 - 雀巢

如果某個檔案不需要加密(解密),那麼跳過那個檔案繼續加密(解密)下一個檔案。

最後,可以通過 File.WriteAllBytes(fileName,data);方法將加密好的位元組陣列寫入檔案當中。

OK到這裡資源的加密就完成了,下一篇分析程式碼層的解密以及FileUtils方法中修改載入資料的方法。