En criptografía , el cifrado XOR simple es un tipo de cifrado aditivo , [1] un algoritmo de cifrado que funciona según los principios:
Por ejemplo, donde denota la operación de disyunción exclusiva (XOR). [2] Esta operación a veces se denomina adición de módulo 2 (o sustracción, que es idéntica). [3] Con esta lógica, una cadena de texto se puede cifrar aplicando el operador XOR bit a bit a cada carácter utilizando una clave dada. Para descifrar la salida, simplemente volviendo a aplicar la función XOR con la clave se eliminará el cifrado.
La cadena "Wiki" ( 01010111 01101001 01101011 01101001 en ASCII de 8 bits ) se puede cifrar con la clave repetida 11110011 de la siguiente manera:
Y a la inversa, para el descifrado:
El operador XOR es extremadamente común como componente en cifrados más complejos. Por sí solo, utilizando una clave repetitiva constante, un cifrado XOR simple puede descifrarse trivialmente utilizando el análisis de frecuencia . Si se puede adivinar o conocer de otro modo el contenido de cualquier mensaje, se puede revelar la clave. Su principal mérito es que es fácil de implementar y que la operación XOR es computacionalmente económica. Por lo tanto, a veces se utiliza un cifrado XOR simple que se repite (es decir, que utiliza la misma clave para la operación XOR en todos los datos) para ocultar información en casos en los que no se requiere una seguridad particular. El cifrado XOR se utiliza a menudo en malware informático para dificultar la ingeniería inversa.
Si la clave es aleatoria y tiene al menos la misma longitud que el mensaje, el cifrado XOR es mucho más seguro que cuando hay repetición de clave dentro de un mensaje. [4] Cuando el flujo de claves se genera mediante un generador de números pseudoaleatorios , el resultado es un cifrado de flujo . Con una clave que es verdaderamente aleatoria , el resultado es un bloc de notas de un solo uso , que en teoría es irrompible .
El operador XOR en cualquiera de estos cifrados es vulnerable a un ataque de texto simple conocido , ya que texto simple texto cifrado = clave . También es trivial invertir bits arbitrarios en el texto simple descifrado manipulando el texto cifrado. Esto se llama maleabilidad .
La razón principal por la que XOR es tan útil en criptografía es porque está "perfectamente equilibrado"; para una entrada de texto simple dada de 0 o 1, el resultado del texto cifrado tiene la misma probabilidad de ser 0 o 1 para un bit de clave verdaderamente aleatorio. [5]
La tabla siguiente muestra los cuatro pares posibles de bits de texto simple y clave. Es evidente que si no se sabe nada sobre la clave o el texto simple, no se puede determinar nada a partir del texto cifrado únicamente. [5]
Otras operaciones lógicas como AND u OR no tienen tal mapeo (por ejemplo, AND produciría tres 0 y un 1, por lo que saber que un bit de texto cifrado dado es un 0 implica que hay una probabilidad de 2/3 de que el bit de texto simple original fuera un 0, a diferencia de la probabilidad ideal de 1/2 en el caso de XOR) [a]
Ejemplo utilizando el lenguaje de programación Python . [b]
Desde el sistema operativo, importe urandomdef genkey ( length : int ) -> bytes : """Generar clave de cifrado.""" return urandom ( length ) def xor_strings ( s , t ) -> bytes : """Concatenar dos cadenas con xor.""" if isinstance ( s , str ): # Las cadenas de texto contienen caracteres individuales return "" .join ( chr ( ord ( a ) ^ b ) for a , b in zip ( s , t ) ) .encode ( ' utf8' ) else : # Los objetos Bytes contienen valores enteros en el rango 0-255 return bytes ([ a ^ b for a , b in zip ( s , t )]) mensaje = 'Este es un mensaje secreto' print ( 'Mensaje:' , mensaje )clave = genkey ( len ( mensaje )) print ( 'Clave:' , clave )cipherText = xor_strings ( mensaje.encode ( 'utf8' ), clave ) print ( 'cipherText : ' , cipherText ) print ( ' descifrado:' , xor_strings ( cipherText , clave ) .decode ( ' utf8' )) # Verificar si xor_strings ( cipherText , key ) . decode ( 'utf8' ) == message : print ( 'Prueba unitaria aprobada' ) else : print ( 'Prueba unitaria fallida' )
Un ejemplo más corto que utiliza el lenguaje de programación R , basado en un rompecabezas publicado en Instagram por GCHQ .
clave secreta <- c ( 0xc6 , 0xb5 , 0xca , 0x01 ) |> as.raw () mensaje_secreto <- "Me encanta Wikipedia" |> charToRaw () |> xor ( clave_secreta ) |> base64enc :: base64encode () bytes_del_mensaje_secreto <- mensaje_secreto |> base64enc :: base64decode () xor ( bytes_del_mensaje_secreto , clave_secreta ) |> rawToChar ()