**:
資源加密實際上是對遊戲所用到的資源進行二進位製碼的轉換,這樣別人就無法獲取到正確的資源。
在遊戲進行的時候通過對資源的解碼來獲取正確的資源,然後進行顯示。
首先用於加密的演算法必須可以進行解密,不然的話就無法進行資源的載入了。
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);方法將加密好的位元組陣列寫入檔案當中。
Unity(C ) 對檔案進行加解密
方法一 直接呼叫加解密方法新增密碼就可以 using system using system.security.cryptography using system.io namespace common 加密類 public class desfile return true return fals...
java異或加解密及其改善
最近在做android的逆向分析,我主要是負責網路請求的逆向分析,在分析的過程中必然會碰到資料加解密的過程。其中最常見的加解密就是異或。異或加密是資料加密中比較簡單的一種,也是比較常用的一種方法。所謂異或就是一種位運算,比如1 1 0 1 0 1,也就是兩個運算位為同為 1 或 0 則返回 0 若兩...
異或運算的簡單加解密應用
xor運算的逆運算是它本身,也就是說兩次異或同乙個數最後結果不變,即 a xor b xor b a。xor運算可以用於簡單的加密,比如我想對我mm說1314520,但怕別人知道,於是雙方約定拿我的生日19880516作為金鑰。1314520 xor 19880516 20665500,我就把206...