如何在python中对2个字符串进行异或?

时间:2016-03-25 02:02:19

标签: python python-2.7 xor

我目前在python中遇到XOR和两个字符串的问题,它会返回乱码结果。

基于研究,我在XORing中推导出的方法如下: -

def xor_strings(s,t):
    """xor two strings together"""
    return "".join(chr(ord(a)^ord(b)) for a,b in zip(s,t))

所以我继续XOR两个字符串,如下所示:

c1 = xor_strings('cisco12300000000','46608024c8f48fd0')
print c1

结果字符串带有乱码,如下图所示: enter image description here

我在XOR操作中做错了吗?

总结我试图生成一个类似于freeradius散列的字符串,其中包含带有共享密钥和验证者IV的userpassword

编辑:这不是重复,因为尝试的解决方案返回乱码因此问题

2 个答案:

答案 0 :(得分:3)

当你离开时,你会得到的是胡言乱语。但是,如果你用原始值对乱码进行异或,你会得到原始字符串:

#!python2
def xor_strings(s,t):
    """xor two strings together"""
    return "".join(chr(ord(a)^ord(b)) for a,b in zip(s,t))

c1 = xor_strings('cisco12300000000','46608024c8f48fd0')
print repr(c1) # To see the unprintable bytes as escape codes
c1 = xor_strings(c1,'46608024c8f48fd0')
print c1

输出:

'W_ESW\x01\x00\x07S\x08V\x04\x08VT\x00'
cisco12300000000

答案 1 :(得分:1)

我假设,通过查看您编写的代码,您想要对相应的字符(它们的ASCII值)进行异或。 所以,'abcde','fghijk' => [97,98,99,100,101],[102,103,104,105,106]是他们的ASCII值。 异或相应的字符给出[7, 5, 11, 13, 15]

您的代码确实生成了上面的数组。如果这是您打算做的,那么您的代码是正确的。是的。

你所看到的原因,看起来像是“胡言乱语”'就是它:

查看低ord()值的字符列。它们会在屏幕上显示看起来像乱码的字符。例如,上面的数组[7, 5, 11, 13, 15]给出['\x07', '\x05', '\x0b', '\r', '\x0f'],在打印时给出看起来像乱码的内容。同样适用于您的两个字符串集。