我有两个以十六进制表示的密文。我想用密文#2来密文#1。这部分可以通过xor_strings
函数正常工作。然后,我想要对xor_strings
返回的字符串中的每个字母用空格字符(其中ASCII码等于20的十六进制)进行xor。但是这部分不适合我,当我运行代码时,我得到了这个错误:
Traceback (most recent call last):
File "hexor.py", line 18, in <module>
xored_with_space=xor_space(xored,binary_space)
File "hexor.py", line 5, in xor_space
return "".join(chr(ord(xored) ^ ord(binary_space)) for x in xored)
File "hexor.py", line 5, in <genexpr>
return "".join(chr(ord(xored) ^ ord(binary_space)) for x in xored)
TypeError: ord() expected a character, but string of length 4 found
以下是我正在运行的代码:
def xor_strings(xs, ys):
return "".join(chr(ord(x) ^ ord(y)) for x, y in zip(xs, ys))
def xor_space(xored,binary_space):
return "".join(chr(ord(xored) ^ ord(binary_space)) for x in xored)
a=raw_input("enter first cipher \n")
b=raw_input("enter second cipher \n")
space="20" #hex ASCII value of space
#convert to binary
binary_a = a.decode("hex")
binary_b = b.decode("hex")
binary_space=space.decode("hex")
xored = xor_strings(binary_a, binary_b).encode("hex")
xored_with_space=xor_space(xored,binary_space)
print xored
print xored_with_space
你能帮我解决这个问题吗?
答案 0 :(得分:1)
使用您编写的正是这样的函数......
def xor_space(xored,binary_space):
return xor_strings(xored," "*len(xored))
我也怀疑你可能不完全理解二元及其含义这个词
我不确定你的想法是什么a.decode("hex")
...但我很确定它没有按照你的想法行事(尽管我可能也错了)......
答案 1 :(得分:1)
由于您知道空格的序数值(0x20
或十进制32
),因此只需使用该值代替binary_space
:
def xor_space(xored):
return "".join(chr(ord(x) ^ 0x20) for x in xored)
但是,原始函数中的实际错误是由ord(xored)
引起的;你打算把x
放在那里而不是xored
。由于xored
在这种情况下变成长度为4的字符串,ord
抱怨它不是单个字符。