为什么 XOR 函数没有打印出预期的十六进制值?

Why XOR function does not print out the expected hex value?

所以我有以下功能,我想知道为什么当我对 X 和 Y 进行异或运算时,它不会打印出 expected_result 的十六进制值?有什么我需要补充的吗?我在函数中遗漏了什么吗?

def xor(X, Y):
  return "".join([chr(ord(a) ^ ord(b)) for (a, b) in zip(X, Y)])
X = "Hello World"
Y = "supersecret"
print(xor(X,Y))

expected_result = "3b101c091d53320c000910"

您忘记了需要将结果 字节 转换为十六进制的部分。相反,您将字节直接转换为字符,这意味着您正在解码本身可能无法打印的字节。

这是在打印之前将两个编码字符值(使用 ord)的二进制结果转换为十六进制的代码。

def xor(X, Y):
  return "".join('{:02x}'.format(ord(a) ^ ord(b)) for (a, b) in zip(X, Y))
X = "Hello World"
Y = "supersecret"
print(xor(X,Y))

请注意,这解决了问题。但是,xor 函数实际上应该返回一个二进制数组。密文通常是二进制的,十六进制只是用来使它们呈现给人类消费:

def xor(X, Y):
  return bytes([(ord(a) ^ ord(b)) for (a, b) in zip(X, Y)])
X = "Hello World"
Y = "supersecret"
print(xor(X,Y).hex())

请注意,我使用了 Python 3,如果您想执行许多转换并处理字节数组,强烈建议使用它。