异或 混淆算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28711703/article/details/79832806

一:使用场景

    当需求对数据的传输有不高的安全加密,且加密的时间复杂度越低越好,这时我们可以使用简单的混淆算法(我认为混淆算法本质上就是一种简单的加密算法)。

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

    

    

猜你喜欢

转载自blog.csdn.net/qq_28711703/article/details/79832806
今日推荐