我有一个实现DES的任务,我选择了python,唯一的问题是我无法弄清楚如何对字符串或字节字符串进行异或,如果我能设法读取,我可以手动对其进行异或其中的1和0。
示例:
s1 = b'abc'
s2 = b'efg'
s3 = XOR(s1,s2) // my own method
我如何对它们进行异或或如何获得代表它们的1和0的二进制值?
如果您使用任何python方法解释它们,我对这种语言相对较新。
答案 0 :(得分:3)
>>> b''.join(chr(ord(a) ^ ord(b)) for a, b in zip(b'abc', b'efg'))
'\x04\x04\x04'
答案 1 :(得分:2)
首先,您需要zip
字符串,然后对每个字符使用ord
(python 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'