#python-3.x #format #byte #xor
#python-3.x #формат #байт #xor
Вопрос:
При попытке xor байты в python3:
import os,binascii
import numpy as np
def xor_byte_hex_strings(a, b) :
return bytes(x ^ y for x, y in zip(a, b))
number_of_bytes = 2
random_bytes = []
random_bytes_str = binascii.b2a_hex(os.urandom(number_of_bytes))
random_bytes.append(random_bytes_str)
print(random_bytes_str)
print(bytearray(random_bytes_str))
random_bytes_str = binascii.b2a_hex(os.urandom(number_of_bytes))
random_bytes.append(random_bytes_str)
resultant = xor_byte_hex_strings(random_bytes[0], random_bytes[1])
print("resultant = ", bytearray(resultant))
print(random_bytes)
resultant = xor_byte_hex_strings(random_bytes[1], resultant)
print(resultant)
Результатом является b’x03x03 x0cU’ вместо b’13ce.
Как нам преобразовать формат из b’ x03 x03 x0cU’ в b’13ce?
Ответ №1:
Почему бы не поработать со строками и int
s, чтобы упростить себе жизнь?
import os,binascii
def xor_strings(a, b):
result = int(a, 16) ^ int(b, 16) # convert to integers and xor them together
return '{:x}'.format(result) # convert back to hexadecimal
number_of_bytes = 2
random_bytes = []
# decode() to turn it into a str.
random_bytes_str = binascii.b2a_hex(os.urandom(number_of_bytes)).decode()
random_bytes.append(random_bytes_str)
random_bytes_str = binascii.b2a_hex(os.urandom(number_of_bytes)).decode()
random_bytes.append(random_bytes_str)
print(random_bytes)
xored = xor_strings(*random_bytes)
print("resultant = ", xored.encode())
print([random_bytes[1], xored])
resultant = xor_strings(random_bytes[1], xored)
print(resultant.encode()) # encode() will turn it back to bytes if you want bytes
Вывод:
['4588', '3af9']
resultant = b'7f71'
['3af9', '7f71']
b'4588'
Комментарии:
1. Шестнадцатеричное значение может состоять не только из 2 байт, это может быть произвольное количество байт, следовательно
int(a, 16)
, позже не будет работать. Это не может быть сохранено в виде строки, поскольку оно также будет вызвано в виде байтов для другой обработки.2.
int(a, 16)
преобразуется в базовое значение 16 (т. Е. шестнадцатеричное), поэтому оно будет работать для любого количества байтов, и последняя строка в моем примере показывает, как преобразовать в байт str, если вы хотите, т.Е..encode()
, но знайте, что и в моем коде, и в вашем вы работаете со строкой байт (ascii) черезb2a_hex
, а не байты.