一:使用场景
当需求对数据的传输有不高的安全加密,且加密的时间复杂度越低越好,这时我们可以使用简单的混淆算法(我认为混淆算法本质上就是一种简单的加密算法)。
本文所做的算法是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