python cryptography hex ascii xor

Python: XOR cadenas hexadecimales



cryptography ascii (2)

Te estás perdiendo un par de cosas aquí.

Primero, no querrá XOR esas cadenas. Tienes las cadenas en una forma codificada, por lo tanto, .decode() debes .decode() :

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

Luego, como ya se mencionó, la función zip() deja de iterar tan pronto como se agota una de las dos secuencias. No se necesita rebanar.

Necesita la segunda versión del bucle: primero, desea obtener el valor ASCII de los caracteres: ord() produce un número. Esto es necesario porque ^ solo funciona en números.

Después de XORAR los números, conviertes el número nuevamente en un carácter con 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")

Al usar .encode() al final, obtenemos la cadena binaria de nuevo en un formulario que se imprime muy bien.

Posible duplicado:
XOR en modo bit de números hexadecimales en python

Estoy tratando de XOR dos cadenas hexadecimales en Python y no sabía realmente por dónde empezar.

Tengo dos cadenas hexagonales:

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

¿Debo usar esto?

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

No entiendo la diferencia con los dos códigos anteriores. ¿Por qué chr y ord ? También he visto gente usando int(hex,16) .


int('''', 16) convierte una cadena hexadecimal en un entero usando la base 16:

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

Así que haz esto:

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