我目前在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
我在XOR操作中做错了吗?
总结我试图生成一个类似于freeradius散列的字符串,其中包含带有共享密钥和验证者IV的userpassword
编辑:这不是重复,因为尝试的解决方案返回乱码因此问题
答案 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']
,在打印时给出看起来像乱码的内容。同样适用于您的两个字符串集。