Подтвердить что ты не робот

Python: шестнадцатеричные строки XOR

Возможный дубликат:
побитовый XOR шестнадцатеричных чисел в python

Я пытаюсь XOR две шестнадцатеричные строки в Python и не знаю, с чего начать.

У меня две шестнадцатеричные строки:

a = "32510ba9a7b2bba9b8005d43a304b5714cc0bb0c8a34884dd91304b8ad40b62b07df44ba6e9d8a2368e51d04e0e7b207b70b9b8261112bacb6c866a232dfe257527dc29398f5f3251a0d47e503c66e935de81230b59b7afb5f41afa8d661cb"
b = "32510ba9babebbbefd001547a810e67149caee11d945cd7fc81a05e9f85aac650e9052ba6a8cd8257bf14d13e6f0a803b54fde9e77472dbff89d71b57bddef121336cb85ccb8f3315f4b52e301d16e9f52f90"

Должен ли я использовать это?

  • return "".join([chr((x) ^ (y)) for (x,y) in zip(a[:len(b)], b)])
  • return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a[:len(b)], b)])

Я не понимаю разницу с двумя приведенными выше кодами. Почему chr и ord? Я также видел людей, использующих int(hex,16).

4b9b3361

Ответ 1

Здесь вам не хватает нескольких вещей.

Во-первых, вы не захотите XOR эти строки. У вас есть строки в кодированной форме, поэтому сначала нужно .decode() их:

binary_a = a.decode("hex")
binary_b = b.decode("hex")

Затем, как уже упоминалось, функция zip() прекращает итерацию, как только одна из двух последовательностей исчерпана. Нет необходимости нарезать.

Вам нужна вторая версия цикла: во-первых, вы хотите получить значение ASCII символов: ord() создает число. Это необходимо, потому что ^ работает только с числами.

После XORing чисел вы затем преобразуете число обратно в символ с помощью chr:

def xor_strings(xs, ys):
    return "".join(chr(ord(x) ^ ord(y)) for x, y in zip(xs, ys))

xored = xor_strings(binary_a, binary_b).encode("hex")

Используя .encode() в конце, мы возвращаем двоичную строку в форму, которая хорошо печатает.

Ответ 2

int('', 16) преобразует шестнадцатеричную строку в целое число с использованием базы 16:

>>> int('f', 16)
15 
>>> int('10', 16)
16

Сделайте так:

result = int(a, 16) ^ int(b, 16) # convert to integers and xor them together
return '{:x}'.format(result)     # convert back to hexadecimal