Articulo de referencia

cifrado XOR

En criptografía , el cifrado XOR simple es un tipo de cifrado aditivo , [ 1 ] un algoritmo de encriptación que opera según los principios: A ⊕ {\displaystyle \oplus } 0 = A, A ⊕...

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

A{\displaystyle \oplus }0 = A,
A{\displaystyle \oplus }A = 0,
A{\displaystyle \oplus }B = B{\displaystyle \oplus }A,
(A{\displaystyle \oplus }B){\displaystyle \oplus }C = A{\displaystyle \oplus }(B{\displaystyle \oplus }DO),
(B{\displaystyle \oplus }A){\displaystyle \oplus }A = B{\displaystyle \oplus }0 = B

Por ejemplo, donde{\displaystyle \oplus }denota la operación de disyunción exclusiva (XOR). [ 2 ] Esta operación a veces se denomina suma (o resta , que es idéntica) de módulo 2. [ 3 ] Con esta lógica, una cadena de texto se puede cifrar aplicando el operador XOR bit a bit a cada carácter usando una clave dada. Para descifrar el resultado, simplemente volver a aplicar la función XOR con la clave eliminará el cifrado.

Ejemplo

La cadena " Wiki " ( 01010111 01101001 01101011 01101001 en ASCII de 8 bits ) se puede cifrar con la clave repetitiva 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 constante que se repite, un cifrado XOR simple puede romperse fácilmente mediante análisis de frecuencia . Si se puede adivinar o conocer el contenido de cualquier mensaje, entonces se puede revelar la clave. Su principal ventaja es que es simple de implementar y que la operación XOR es computacionalmente económica. Por lo tanto, un cifrado XOR simple que se repite (es decir, que utiliza la misma clave para la operación XOR en todos los datos) se utiliza a veces para ocultar información en casos donde no se requiere una seguridad particular. El cifrado XOR se usa frecuentemente 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 la secuencia de claves se genera mediante un generador de números pseudoaleatorios , el resultado es un cifrado de flujo . Con una clave verdaderamente aleatoria , el resultado es una libreta de un solo uso , que es irrompible en teoría .

El operador XOR en cualquiera de estos cifrados es vulnerable a un ataque de texto plano conocido , ya que el texto plano{\displaystyle \oplus }texto cifrado = clave . También es trivial invertir bits arbitrarios en el texto plano 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 plano 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 que aparece a continuación muestra los cuatro pares posibles de bits de texto plano y clave. Es evidente que si no se conoce nada sobre la clave o el texto plano, no se puede determinar nada a partir del texto cifrado únicamente. [ 5 ]

Otras operaciones lógicas como AND u OR no tienen una correspondencia similar. Por ejemplo, considere la tabla para AND que se muestra a continuación:

Si el texto cifrado fuera 0, entonces habría una probabilidad de 2/3 de que el texto plano también fuera 0. Y si el texto cifrado fuera 1, entonces el texto plano tendría que ser 1. Esto revela claramente información sobre el texto que el método XOR no proporciona. [ a ]

Ejemplo de implementación

Ejemplo utilizando el lenguaje de programación JavaScript . [ 6 ]

function xor_Encrypt ( inputString , key ) { let encrypted_Hex = "" ; for ( let i = 0 ; i < inputString . length ; i ++ ) { const plain_string = inputString . charCodeAt ( i ); const key_Char = key . charCodeAt ( i % key . length ); const xor_Result = plain_string ^ key_Char ; // Realizar la operación XOR // Convertir el resultado XOR a una cadena hexadecimal de dos dígitos // Rellenar con '0' si es un solo dígito (por ejemplo, 5 -> "05") let hex = xor_Result . toString ( 16 ); if ( hex . length < 2 ) { hex = "0" + hex ; } encrypted_Hex += hex ; } return encrypted_Hex ; }function xorDecrypt ( hexInput , key ) { let decrypted_String = '' ; // Paso 1: Convertir la cadena hexInput en un array const bytes = []; // Iterar a través de la cadena hexadecimal de dos caracteres en dos caracteres for ( let i = 0 ; i < hexInput . length ; i += 2 ) { // Tomar una subcadena hexadecimal de dos caracteres (por ejemplo, "AB") const hexa_Byte = hexInput . slice ( i , i + 2 ); // Convertir la subcadena hexadecimal a un entero (por ejemplo, "AB" -> 171) bytes . push ( parseInt ( hexa_Byte , 16 )); } // Paso 2: XOR cada byte con la clave y convertirlo de nuevo a carácter for ( let i = 0 ; i < bytes . length ; i ++ ) { const byte_Value = bytes [ i ]; const key_Char = key . charCodeAt ( i % key.length ); const xor_Result = byte_Value ^ key_Char ; // Realizar la operación XOR // Convertir el resultado XOR de nuevo a un carácter decrypted_String += String.fromCharCode ( xor_Result ) ; } return decrypted_String ; }

Otro ejemplo utilizando el lenguaje de programación Python . [ b ]

desde os importar urandomdef generate_key ( length : int ) -> bytes : """Genera la clave de cifrado.""" return urandom ( length )def xor_strings ( s , t ) -> bytes : """Concatena dos cadenas mediante 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 = generar_clave ( len ( mensaje )) print ( "Clave:" , clave )cipherText = xor_strings ( message.encode ( " utf8" ) , key ) print ( "cipherText:" , cipherText ) print ( "decrypted:" , xor_strings ( cipherText , key ) .decode ( " utf8" ))# Verificar si xor_strings ( cipherText , key ) . decode ( "utf8" ) == message : print ( "Prueba unitaria superada" ) else : print ( "Prueba unitaria fallida" )

Un ejemplo más breve que utiliza el lenguaje de programación R , basado en un acertijo publicado en Instagram por GCHQ .

secret_key <- c ( 0xc6 , 0xb5 , 0xca , 0x01 ) |> as.raw ()secret_message <- "Me encanta Wikipedia" |> charToRaw () |> xor ( secret_key ) |> base64enc :: base64encode ()secret_message_bytes <- secret_message |> base64enc :: base64decode () xor ( secret_message_bytes , secret_key ) |> rawToChar ()

Véase también

Referencias

Notas

  1. Hay 3 maneras de obtener un bit de salida (texto cifrado) de 0 en unaoperación AND : Texto plano=0, clave=0; Texto plano=0, clave=1; Texto plano=1, clave=0. Por lo tanto, si sabemos que el bit del texto cifrado es 0, hay una probabilidad de 2/3 de que el bit del texto plano también sea 0 para una clave verdaderamente aleatoria. Para XOR, hay exactamente 2 maneras, por lo que la probabilidad es 1/2 (es decir, igualmente probable, por lo que no podemos obtener ninguna información de esto).
  2. Esto se inspiró en 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. ^ Paar y Pelzl 2009 , págs. 32-34.
  6. armasahar/XOR-Cipher , 26 de septiembre de 2025

Fuentes

  • Budiman, MA; Tarigan, JT; Winata, AS (2020). "Cerradura digital basada en Arduino UNO y Android que utiliza una combinación de cifrado de Vigenère y cifrado XOR" . Journal of Physics: Conference Series . 1566 (1) 012074. IOP Publishing. Bibcode : 2020JPhCS1566a2074B . doi : 10.1088/1742-6596/1566/1/012074 . ISSN 1742-6588 . 
  • Churchhouse, Robert (2002), Códigos y cifrados: Julio César, Enigma e Internet , Cambridge: Cambridge University Press, ISBN 978-0-521-00890-7
  • Garg, Satish Kumar (2017). "Criptografía mediante cifrado XOR" . Revista de investigación en ciencia y tecnología . 9 (1). Publicaciones A y V: 25. doi : 10.5958/2349-2988.2017.00004.3 . ISSN 0975-4393 . 
  • Gödel, Kurt (diciembre de 1931). "Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I". Monatshefte für Mathematik und Physik (en alemán). 38– 38 (1): 173– 198. doi : 10.1007/BF01700692 . ISSN 0026-9255 . S2CID 197663120 .  
  • Lewin, Michael (junio de 2012). "Todo sobre XOR" . Overload . 2 ((109): 14– 19. Recuperado el 29 de agosto de 2021 .
  • Paar, Christof; Pelzl, Jan (2009). Comprender la criptografía: un libro de texto para estudiantes y profesionales . Springer. ISBN 978-3-642-04101-3OCLC 567365751 
  • Richter, Wolfgang (3 de agosto de 2012), "Criptografía irrompible en 5 minutos" , Crossroads: The ACM Magazine for Students , Association for Computing Machinery
  • Tutte, WT (19 de junio de 1998), Fish and I (PDF) , archivado del original (PDF) el 7 de febrero de 2020 , consultado el 11 de enero de 2020.Transcripción de una conferencia impartida por el profesor Tutte en la Universidad de Waterloo.
Obtenido de " https://en.wikipedia.org/w/index.php?title=XOR_cipher&oldid=1355319825 "