stringtranslate.com

Cifrado XOR

En criptografía , el cifrado XOR simple es un tipo de cifrado aditivo , [1] un algoritmo de cifrado que funciona según los principios:

Un 0 = Un,
Una A = 0,
A B = B A,
(A B) C = A (B C),
(BA ) A = B0 = B

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.

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:

Y a la inversa, para el descifrado:

Uso y seguridad

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 .

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 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 de implementación

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 ()       

Véase también

Referencias

Notas

  1. ^ Hay 3 formas de obtener un bit de salida (de texto cifrado) de 0 a partir de una operació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)
  2. ^ Esto fue inspirado por Richter 2012

Citas

  1. ^ Tutte 1998, pág. 3
  2. ^ Lewin 2012, págs. 14-19.
  3. ^ Churchhouse 2002, pág. 11
  4. ^ Churchhouse 2002, pág. 68
  5. ^ ab Paar y Pelzl 2009, págs.

Fuentes