我正在研究Python中的DES算法。
在Fiestle函数之一的函数中,我必须使用XOR元素来获取密码。
有什么方法可以在python中执行转换操作,下面是我试过的代码:
C0是1111000011001100101010101111
D0是0101010101100110011110001111
c0_d0=[]
for i in range(1):
t=[]
t.append(C0)
t.append(D0)
c0_d0.append(t)
#print c0_d0
def str_to_bin(strr,shifts):
for i in range(1,17):
temp=[]
for j in range(1):
temp.append(int(c0_d0[i-1][0])<<1)
temp.append(int(c0_d0[i-1][1])<<1)
c0_d0.append(temp)
return c0_d0
我希望元素是通过移位来获得的二进制字符串。第一个元素对是通过移位前一个元素对获得的,下一个元素对是通过前一个元素获得的,依此类推。只给出了第0个索引元素。
实施例 C0是1111000011001100101010101111 D0是0101010101100110011110001111
C1应为C0 <&lt;&lt; 1,等于1110000110011001010101011110
D1应为D0&lt;&lt; 1,等于1010101011001100111100011110
答案 0 :(得分:1)
尝试不使用十进制或字符串编码的二进制文件;使用数字的效率和一致性要高得多,Python支持将它们转换为其他基础或从其他基础转换。
>>> C0=0b1111000011001100101010101111
>>> bin(C0<<1)
'0b11110000110011001010101011110'
你想在某些时候限制你的大小,因为Python支持任意大的整数(在Python 2中称为long
,这是你的输出中的L来源,或者只是Python中的int
3)。这通常通过位掩码来完成。如果要在特定基础中显示结果,也可以使用特定宽度进行格式设置。
>>> bin(C0 & ((1<<16)-1)) # truncate to 16 bits
'0b1100101010101111'
>>> '{:032b}'.format(C0) # format as 32 digit binary string
'00001111000011001100101010101111'
特别不切实际的是,您的示例输出混合了字符串和数字形式的数据。
以下是如何从字符串中解析二进制文件的示例,以防您的程序将其作为输入接收,以及更直接的格式化方法。
>>> D = int('0101010101100110011110001111', 2) # parse as binary = base 2
>>> D
89548687
>>> format(D, '032b')
'00000101010101100110011110001111'
答案 1 :(得分:0)
你对左移的定义不是标准的(乘以2)。您可以使用字符串轻松模拟:
C = '1111000011001100101010101111'
D = '0101010101100110011110001111'
def shstr(string):
return string[1:]+'0'
zeroes = ''.join(['0' for _ in range(len(C))])
while C != zeroes or D != zeroes:
print C,D
C = shstr(C)
D = shstr(D)
或者把它放到一个函数中并且产生。