En criptografía , el cifrado XOR simple es un tipo de cifrado aditivo , [1] un algoritmo de cifrado que opera de acuerdo con los principios:
- A 0 = A,
- A A = 0,
- A B = B A,
- (A B) C = A (B C),
- (B A) A = B 0 = B,
dónde denota la operación de disyunción exclusiva (XOR). [2] Esta operación a veces se denomina suma de módulo 2 (o resta, que es idéntica). [3] Con esta lógica, se puede cifrar una cadena de texto aplicando el operador XOR bit a bit a cada carácter utilizando una clave determinada. Para descifrar la salida, simplemente volver a aplicar la función XOR con la clave eliminará el cifrado.
Ejemplo
Por ejemplo, la cadena "Wiki" ( 01010111 01101001 01101011 01101001 en ASCII de 8 bits ) se puede cifrar con la clave repetida 11110011 de la siguiente manera:
01010111 01101001 01101011 01101001 11110011 11110011 11110011 11110011 = 10100100 10011010 10011000 10011010
Y a la inversa, para el descifrado:
10100100 10011010 10011000 10011010 11110011 11110011 11110011 11110011 = 01010111 01101001 01101011 01101001
Uso y seguridad
El operador XOR es extremadamente común como componente en cifrados más complejos. Por sí mismo, usando una clave de repetición constante, un cifrado XOR simple puede romperse trivialmente usando análisis de frecuencia . Si se puede adivinar o conocer el contenido de cualquier mensaje, entonces se puede revelar la clave. Su principal mérito es que es simple de implementar y que la operación XOR es computacionalmente económica. Por lo tanto, a veces se usa un cifrado XOR repetido simple (es decir, usando la misma clave para la operación xor en todos los datos) para ocultar información en casos donde no se requiere seguridad particular. El cifrado XOR se usa a menudo en malware informático para dificultar la ingeniería inversa.
Si la clave es aleatoria y es al menos tan larga como 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 es generado por un generador de números pseudoaleatorios , el resultado es un cifrado de flujo . Con una clave que es verdaderamente aleatoria , el resultado es una almohadilla de un solo uso , que es irrompible en teoría .
En cualquiera de estos cifrados, el operador XOR es vulnerable a un ataque de texto sin formato conocido , ya que el texto sin formato texto cifrado = clave . También es trivial invertir bits arbitrarios en el texto plano descifrado manipulando el texto cifrado. A esto se le llama maleabilidad .
Utilidad en criptografía
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 0 o 1, es igualmente probable que el resultado del texto cifrado sea 0 o 1 para un bit de clave verdaderamente aleatorio. [5]
Ejemplo demostrativo
La siguiente tabla muestra los cuatro pares posibles de texto sin formato y bits clave. Está claro que si no se sabe nada sobre la clave o el texto sin formato, no se puede determinar nada solo a partir del texto cifrado. [5]
Texto sin formato | Clave | Texto cifrado |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Otras operaciones lógicas como AND u OR no tienen tal mapeo (por ejemplo, AND produciría tres ceros 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 texto plano original bit era un 0, a diferencia de la probabilidad ideal de 1/2 en el caso de XOR) [nb 1]
Implementación de ejemplo
Ejemplo usando el lenguaje de programación Python . [6]
from __future__ import print_function , unicode_literals from os import urandomdef genkey ( longitud : int ) -> bytes : "" "Generar clave." "" return urandom ( longitud ) def xor_strings ( s , t ) -> bytes : "" "xo dos cadenas juntas." "" if isinstance ( s , str ): # Las cadenas de texto contienen caracteres individuales return b "" . join ( chr ( ord ( a ) ^ ord ( b )) para a , b en zip ( s , t )) else : # Los objetos de Python de 3 bytes contienen valores enteros en el rango 0-255 return bytes ([ a ^ b para a , b en zip ( s , t )]) message = 'Este es un mensaje secreto' print ( 'Mensaje:' , mensaje )clave = genkey ( len ( mensaje )) print ( 'Clave:' , clave )cipherText = xor_strings ( message . encode ( 'utf8' ), key ) print ( 'cipherText:' , cipherText ) print ( 'descifrado:' , xor_strings ( cipherText , key ) . decode ( 'utf8' ))# Verifique si xor_strings ( cipherText , key ) . decode ( 'utf8' ) == mensaje : print ( 'Prueba unitaria aprobada' ) else : print ( 'Prueba unitaria fallida' )
Ver también
Notas
- ^ Hay 3 formas de obtener un bit de salida (texto cifrado) de 0 a partir de unaoperación AND : Texto sin formato = 0, clave = 0; Texto sin formato = 0, clave = 1; Texto sin formato = 1, clave = 0. Por lo tanto, si sabemos que el bit de texto cifrado es un 0, existe una probabilidad de 2/3 de que el bit de texto sin formato también sea un 0 para una clave verdaderamente aleatoria. Para XOR, hay exactamente 2 formas, por lo que la probabilidad es 1/2 (es decir, igualmente probable, por lo que no podemos aprender nada de esta información)
Referencias
- ^ Tutte 1998 , p. 3
- ^ ACCU. "Todo sobre XOR" . accu.org . Consultado el 7 de marzo de 2021 .
- ^ Churchhouse 2002 , p. 11
- ^ Churchhouse 2002 , p. 68
- ^ a b Paar, Christof (2009). Comprensión de la criptografía: un libro de texto para estudiantes y profesionales . Jan Pelzl. Berlín: Springer. págs. 32–34. ISBN 3-642-04101-9. OCLC 567365751 .
- ^ Esto fue inspirado por Richter, Wolfgang (3 de agosto de 2012), "Criptografía irrompible en 5 minutos" , Crossroads: The ACM Magazine for Students , Association for Computing Machinery
Bibliografía
- Churchhouse, Robert (2002), Códigos y cifrados: Julio César, el enigma e Internet , Cambridge: Cambridge University Press, ISBN 978-0-521-00890-7
- Tutte, WT (19 de junio de 1998), Fish and I (PDF) , consultado el 11 de enero de 2020Transcripción de una conferencia impartida por el Prof. Tutte en la Universidad de Waterloo