python中的Xor位

时间:2014-12-31 08:23:33

标签: python string xor bits des

我有一个实现DES的任务,我选择了python,唯一的问题是我无法弄清楚如何对字符串或字节字符串进行异或,如果我能设法读取,我可以手动对其进行异或其中的1和0。

示例:

s1 = b'abc'
s2 = b'efg'

s3 = XOR(s1,s2) // my own method

我如何对它们进行异或或如何获得代表它们的1和0的二进制值?

如果您使用任何python方法解释它们,我对这种语言相对较新。

3 个答案:

答案 0 :(得分:3)

>>> b''.join(chr(ord(a) ^ ord(b)) for a, b in zip(b'abc', b'efg'))
'\x04\x04\x04'

答案 1 :(得分:2)

首先,您需要zip字符串,然后对每个字符使用ordpython 2}和^

>>> s1 = b'abc'
>>> s2 = b'efg'
>>> ''.join(chr(ord(i)^ord(j)) for i,j in zip(s1,s2))
'\x04\x04\x04'

当参数是8位字符串时,字节的ord()函数返回值。但如果您使用的是python 3,则不需要ord

>>> ''.join(chr(i^j) for i,j in zip(s1,s2))
'\x04\x04\x04'
  

由于字节对象是整数序列(类似于元组),对于字节对象b,b[0]将是整数,而b[0:1]将是长度为1的字节对象。(与文本字符串形成对比,其中索引和切片都将生成一个长度为1)的字符串

example :

>>> s1[0]
97
>>> s1[0:1]
b'a'

如果你想转换回你的字符串,你需要将XOR ed字符串转换为二进制,你可以通过binascii.a2b_qp函数来完成:

>>> import binascii 
>>> s=''.join(chr(i^j) for i,j in zip(s1,s2))
>>> s4=binascii.a2b_qp(s)
>>> ''.join(chr(i^j) for i,j in zip(s1,s4))
'efg'

答案 2 :(得分:1)

效率不高,但这应该有用。

s1 = b'abc'
s2 = b'efg'
s3= b''
for c1,c2 in zip(s1, s2):
    s3 += chr( ord(c1) ^ ord(c2) )

>>> s3
'\x04\x04\x04'