1. 程式人生 > >異或 混淆演算法

異或 混淆演算法

一:使用場景

    當需求對資料的傳輸有不高的安全加密,且加密的時間複雜度越低越好,這時我們可以使用簡單的混淆演算法(我認為混淆演算法本質上就是一種簡單的加密演算法)。

    本文所做的演算法是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