gpt4 book ai didi

python - 为什么我得到错误的 XOR 输出

转载 作者:行者123 更新时间:2023-12-01 02:20:22 25 4
gpt4 key购买 nike

我刚刚开始 cryptopals.com 挑战,我已经陷入了第二个问题。由于某种原因,我的输出只有一个字符而不是 7 是错误的,我得到 3 作为我的 XOR 运算的第一个数字。

你能帮我找出代码中的错误吗:

def XORfunction(input_1, input_2):
bin_input_1 = hexToBinary(input_1)
bin_input_2 = hexToBinary(input_2)

# check if length of strings is the same for XOR compare or add "0" to the end
if len(bin_input_1) != len(bin_input_2):

if len(bin_input_1) > len(bin_input_2):
number_length = len(bin_input_1)
temp_input = list(bin_input_2)
for x in xrange(0, number_length - len(bin_input_2)):
temp_input.insert(0, "0")
bin_input_2 = "".join(temp_input)

if len(bin_input_1) < len(bin_input_2):
number_length = len(bin_input_2)
temp_input = list(bin_input_1)
for x in xrange(0, number_length - len(bin_input_1)):
temp_input.insert(0, "0")
bin_input_1 = "".join(temp_input)
solution = []
# XOR is like a sum so if el1+el2 == 1 output is 1 else output is 0
for x in xrange(0, len(bin_input_1) - 1):
# the array is iterated from [0] to len(bin_input_1)-1 so the elements are calculated from last to first
current_compare = int(bin_input_1[x]) + int(bin_input_2[x])
if current_compare == 1:
solution.insert(-1, "1")
else:
solution.insert(-1, "0")
return dec_to_hex(int("".join(solution), 2))


# the final solution has to be converted from decimal to hexadecimal
def dec_to_hex(value):
dictionary_hex = "0123456789abcdef"
solution = []
while value != 0:
solution.insert(0, dictionary_hex[value % 16])
value = value / 16
return "".join(solution)


# Hex is converted to a binary string to make comparisons easy as the digits become easy to select as an array of chars
def hexToBinary(text):
# first Hex is converted to decimal, then to binary (that needs to be sliced for a clean output), lastly it becomes a string
return str(bin(int(text, base=16))[2:])


print XORfunction("1c0111001f010100061a024b53535009181c", "686974207468652062756c6c277320657965")

# expected output: 746865206b696420646f6e277420706c6179
# my output: 346865206b696420646f6e277420706c6179

这是我第一次发帖,因此欢迎任何有关格式/代码的提示。

PS:我知道我应该使用库,但我想先弄清楚我的错误是什么

最佳答案

您有几个问题:

  • 您的 hexToBinary() 函数不会生成填充的二进制文件。 bin() 不会返回每个字节 8 位;不包括前导零!因此,第一个字符串的开头缺少 000,另一个字符串的开头缺少 0。您尝试在 XORfunction 函数中对此进行补偿,但这只会加回 2 个零,而不是 3 个。

    您可以使用 str.format() 方法来确保获得正确的位数(零填充):

    return '{:0{}b}'.format(int(text, base=16), len(text) * 4)

    b 格式化指令告诉 str.format() 生成数字的二进制表示形式。宽度前的 0 表示将数字补零至所需的长度,长度的 {} 占位符取自 len(text) * 4 值,因此输入中每个十六进制字符 4 位。

  • 您将在列表中最后一个元素之前插入解决方案位。这会将第一位保留在解决方案的末尾,其他所有内容都插入在它之前:

    >>> demo = []
    >>> demo.insert(-1, 'foo') # inserting into an empty list
    >>> demo
    ['foo']
    >>> demo.insert(-1, 'bar') # inserting before the last element
    >>> demo
    ['bar', 'foo']
    >>> demo.insert(-1, 'spam') # inserting before the last element
    ['bar', 'spam', 'foo']

    只需使用appending将元素添加到列表末尾:

    solution.append("1")

    solution.append("0")
  • 您跳过最后一位的处理。您需要一直迭代到 len(bin_input_1):

    for x in xrange(len(bin_input_1)):

应用这 3 个修复后,您的代码可以正常工作并产生预期的输出。

您的代码确实在Python语言和标准库中重新发明了标准轮子:

  • 使用 ^ 运算符一次处理整个字节,而不是手动对每个位进行异或。
  • 使用binascii.hexlify()binascii.unhexlify() functions在十六进制和字节之间进行转换。
  • 在 Python 2 中,使用 bytearray() type将二进制数据作为整数序列处理,这更容易应用异或运算。
  • 使用zip() function一起迭代两个序列,将两个序列中的元素配对。

放在一起作为 Python 2 解决方案:

from binascii import hexlify, unhexlify

def XORfunction(input_1, input_2):
input_1 = bytearray(unhexlify(input_1))
input_2 = bytearray(unhexlify(input_2))
return hexlify(bytearray(
a ^ b for a, b in zip(input_1, input_2)))

在 Python 3 中,您可以简单地省略前两个 bytearray() 调用,并将最后一个调用替换为 bytes()

关于python - 为什么我得到错误的 XOR 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48028871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com