異或 混淆演算法
一:使用場景
當需求對資料的傳輸有不高的安全加密,且加密的時間複雜度越低越好,這時我們可以使用簡單的混淆演算法(我認為混淆演算法本質上就是一種簡單的加密演算法)。
本文所做的演算法是python寫的異或混淆演算法。
二:原始碼
#coding=utf-8 ''' Created on 2018��4��6�� @author: ������ ''' #初始資料,必須是偶數字節 array=[0x1E,0x12,0x13,0x14,0x11,0x12,0x13,0x14] #array=[0b1,0b1,0b1,0b1,0b0,0b0,0b0,0b0,0b1,0b1,0b1,0b1,0b0,0b0,0b0,0b0,0b1,0b1,0b1,0b1,0b0,0b0,0b0,0b0,0b1,0b1,0b1,0b1,0b0,0b0,0b0,0b0] #flag_array是用來取異或的標準數 flag_array=[0x1E,0x5C] def process(array): temp_array=[] index=0 while(index<len(array)): num=array[index]^flag_array[index%2] temp_array.append(num) index=index+1 return temp_array def de_process(array): temp_array=[] index=0 while(index<len(array)): num1=array[index] num=num1^flag_array[index%2] temp_array.append(num) index=index+1 return temp_array #測試 # array1=process(array) # array2=de_process(array1) # def my_print(array): for index in range(len(array)): print('%#x '%array[index],end="") print("") # my_print(array) # my_print(array1) # my_print(array2)
三:測試結果
第一行是原始一位元組16進位制資料
第二行是經過一次混淆後的資料
第三行是進過解混淆後的資料,和第一行資料是一致的
四:完成該該演算法出現的問題
1.print 的格式問題。在該演算法測試時,我寫了一個my_print function。如果只是簡單的用print打印出陣列,則預設時按照10進位制列印的,體現不出按照16進位制運算所得的效果。但其實進過process 和de_process兩個function就能完成完成核心功能。因為資料在記憶體的儲存格式都是按照二進位制儲存的 ,和列印的格式無關。
2.二進位制(bit),八進位制(oct),16進位制(ox),一位元組 之間的關係。這是兩種不同的描述,本質上沒有任何關係。今天太傻逼了。boss一直說時按照一位元組二進位制數表示,意思時一位元組16進位制運算就行。我一直理解成一位元組,八位,所以必須是八位元組。哎。。。
3.在中間走過了很多彎路。表現是我一直想將十進位制、二進位制、十六進位制之間進行轉化。這樣才能和輸入的格式一致。我忘掉了不管是什麼進位制,在記憶體儲存的本質都是二進位制,只是列印的格式不統一而已。在轉貨中也遇到一個相當噁心的問題。
hen(num)、bin(x),int(str(num),16)分別是常用的將二進位制、十進位制、16進位制之間進行轉化的格式,但是轉化後的結果是str型別,所以沒法進行異或,也沒法轉換成int型然後進行異或。
4.自定義列印
print('%#x '%array[index],end="")
按照十六進位制列印
end=""表示在print 之後不進行回車換行
5.python的for 語句和while 語句
python 的for語句中沒有 for(int i=0;i<length;i++)這樣的形式。當i始終+1時,我們可以用for index in range(length):替代。但當index的需求時非+1時,我們就只能用while語句完成。
index=0
while(index<length):
index=index+k