Solución al último reto de criptografía que he puesto en este blog y que hacía referencia al método de cifrado OTP, y, en la medida que éste se implemente correctamente, al secreto perfecto.
El enunciado del reto decía lo siguiente: El otro día un amigo mío me dijo que había estado leyendo sobre el cifrado OTP (del inglés ‘one-time pad’) o libreta de un solo uso y me comentó que, por lo que había entendido, este método proporciona lo que se llama el secreto perfecto, es decir, el criptograma es indescifrable si no se conoce la clave de cifrado. Yo le contesté: Depende…; lo que pareció no sentarle muy bien y no continuó hablando sobre el tema. Algunos días después recibí un correo electrónico de mi amigo en el que me decía lo siguiente: “como eres 'muy listo', te envío los dos siguientes criptogramas cifrados con OTP a ver si eres capaz de: descifrarlos, obtener la clave y decirme cuál es la solución a este reto, y como estoy seguro de que no vas a poder resolver este desafío, te doy una pista: SECRETO PERFECTO".
Y como recurso asociado al reto se proporcionaba el siguiente: criptogramas.txt.
Solución: Antes de poner la solución al reto conviene recordar en qué consiste el método de cifrado OTP y qué condiciones deben reunirse para que se pueda decir que éste presenta las características propias de lo que Claude Shannon llamó secreto perfecto.
En el cifrado OTP la clave (K) debe tener una longitud igual o superior al texto en claro a cifrar (M) y el criptograma (C) se obtiene realizando la siguiente operación ⊕ (XOR):
Para descifrar el criptograma (C) el receptor utilizaría la misma clave (K) para obtener el texto en claro (M), de la siguiente forma:
Por otra parte, para que se pueda hablar de secreto perfecto el criptograma no debe proporcionar absolutamente ninguna información acerca del texto en claro, es decir, dado un texto cifrado todos los textos en claro posibles tienen que ser equiprobables, y para ello no hay que perder de vista que su implementación debe considerar necesariamente los siguientes tres requisitos esenciales con respecto a la clave de cifrado (K):
- Tal y como ya he indicado: debe tener, al menos, la misma longitud que el mensaje a cifrar.
- Debe ser perfectamente aleatoria.
- Nunca debe reutilizarse, ni total ni parcialmente, y, evidentemente, debe permanecer en el más estricto secreto (intercambio seguro y eliminación confidencial tras su uso).
Volviendo al reto, por el correo que me envió mi amigo parece ser que, primero, efectivamente no le sentó muy bien mi comentario - ya que me dice: “como eres ‘muy listo’, …” :) - y, segundo, que no tiene muy claro por qué este método de cifrado se llama OTP (‘one-time pad’), porque si, como parece, ha utilizado la misma clave para cifrar ambos mensajes (“a ver si eres capaz de: descifrarlos, obtener la clave y …”) ha dejado abierta la puerta al criptoanálisis y, por tanto, de secreto perfecto nada de nada.
Es decir, en el caso de que se cometa el error de reutilizar la clave, un criptoanalista que se haga con dos criptogramas cifrados con la misma clave puede obtener los textos en claro correspondientes sin demasiados problemas utilizando la técnica ‘crib dragging’.
Pero, ¿cómo?. Si se utiliza la misma clave (K) para cifrar dos textos en claro (M1 y M2) resulta que:
Si hago XOR de ambos criptogramas (C1 y C2):
Con lo que, con independencia de la clave utilizada (K), si voy deduciendo o infiriendo partes de uno u otro de los textos en claro (‘cribs’) iré obteniendo las partes correspondientes del otro mensaje en claro.
En resumen, como creo que mi amigo ha reutilizado la clave, para atacar este cifrado y descubrir los mensajes en claro correspondientes a ambos criptogramas se puede actuar de la siguiente manera:
1.- Realizar la operación ⊕ de los dos criptogramas.
2.- Intentar deducir parte de un palabra, una palabra completa o varias palabras que probablemente aparezca/n en uno de los dos textos en claro y codificar la parte inferida (‘crib’) como una cadena hexadecimal (los criptogramas dados están codificados en hexadecimal).
3.- Realizar la operación ⊕ de la ‘crib’ en hexadecimal a partir de la primera posición del resultado de la operación ⊕ realizada a los dos criptogramas.
3.1.- Si el resultado obtenido es un texto legible puedo pensar que, efectivamente, la ‘crib’ empleada aparece en uno de los textos en claro y que he obtenido la parte del texto en claro correspondiente a ésta en el otro texto en claro, e intento adivinar otra ‘crib’ repitiendo el punto 3.
3.2.- Si el resultado no es un texto legible, realizo una operación ⊕ de la ‘crib’ en hexadecimal a partir de la siguiente posición del resultado de la operación ⊕ realizada a los dos criptogramas.
Para llevar a cabo todo lo anterior recomiendo utilizar la siguiente herramienta de ‘crib dragging’ interactiva:
- C1 ⊕ C2:
- Deducir una 'crib', es decir, parte de un palabra, una palabra completa o varias palabras que probablemente aparezca/n en uno de los dos textos en claro, con la que se obtenga un texto legible en las mismas posiciones del otro texto en claro, y repetir este proceso con las 'cribs' que sean necesarias hasta obtener los textos en claro correspondientes a los dos criptogramas.
Crib = "SECRETO PERFECTO":
Crib = "EL SECRETO PERFECTO":
Crib = "CIFRAR":
Crib = "CRIPTOGRAMA":
Crib = "EL SECRETO PERFECTO SE PRODUCE CUANDO EL TEXTO":
Y así sucesivamente; ir adivinando más partes de palabras, palabras completas y/o varias palabras que probablemente aparezca/n en uno de los dos textos en claro hasta conseguir descifrar ambos criptogramas, ejercicio que dejo a quien esté interesado en resolver completamente este reto y/o en el manejo de la herramienta utilizada.
Y, finalmente, a medida que se vayan descifrando los dos criptogramas o una vez descifrados completamente ambos se puede ir obteniendo la clave de cifrado parcial o totalmente, respectivamente, sin más que realizar la operación ⊕ entre la parte hallada de uno de los dos textos en claro y la misma parte del criptograma correspondiente. Ejemplo:
Con lo que la solución a este reto, que está en la clave, es: CLAUDE_SHANNON.
******** PRÓXIMO RETO
Reto 39: "Geheim!".
El enunciado del reto decía lo siguiente: El otro día un amigo mío me dijo que había estado leyendo sobre el cifrado OTP (del inglés ‘one-time pad’) o libreta de un solo uso y me comentó que, por lo que había entendido, este método proporciona lo que se llama el secreto perfecto, es decir, el criptograma es indescifrable si no se conoce la clave de cifrado. Yo le contesté: Depende…; lo que pareció no sentarle muy bien y no continuó hablando sobre el tema. Algunos días después recibí un correo electrónico de mi amigo en el que me decía lo siguiente: “como eres 'muy listo', te envío los dos siguientes criptogramas cifrados con OTP a ver si eres capaz de: descifrarlos, obtener la clave y decirme cuál es la solución a este reto, y como estoy seguro de que no vas a poder resolver este desafío, te doy una pista: SECRETO PERFECTO".
Y como recurso asociado al reto se proporcionaba el siguiente: criptogramas.txt.
Solución: Antes de poner la solución al reto conviene recordar en qué consiste el método de cifrado OTP y qué condiciones deben reunirse para que se pueda decir que éste presenta las características propias de lo que Claude Shannon llamó secreto perfecto.
En el cifrado OTP la clave (K) debe tener una longitud igual o superior al texto en claro a cifrar (M) y el criptograma (C) se obtiene realizando la siguiente operación ⊕ (XOR):
C = M ⊕ K
Para descifrar el criptograma (C) el receptor utilizaría la misma clave (K) para obtener el texto en claro (M), de la siguiente forma:
M = C ⊕ K
Por otra parte, para que se pueda hablar de secreto perfecto el criptograma no debe proporcionar absolutamente ninguna información acerca del texto en claro, es decir, dado un texto cifrado todos los textos en claro posibles tienen que ser equiprobables, y para ello no hay que perder de vista que su implementación debe considerar necesariamente los siguientes tres requisitos esenciales con respecto a la clave de cifrado (K):
- Tal y como ya he indicado: debe tener, al menos, la misma longitud que el mensaje a cifrar.
- Debe ser perfectamente aleatoria.
- Nunca debe reutilizarse, ni total ni parcialmente, y, evidentemente, debe permanecer en el más estricto secreto (intercambio seguro y eliminación confidencial tras su uso).
Volviendo al reto, por el correo que me envió mi amigo parece ser que, primero, efectivamente no le sentó muy bien mi comentario - ya que me dice: “como eres ‘muy listo’, …” :) - y, segundo, que no tiene muy claro por qué este método de cifrado se llama OTP (‘one-time pad’), porque si, como parece, ha utilizado la misma clave para cifrar ambos mensajes (“a ver si eres capaz de: descifrarlos, obtener la clave y …”) ha dejado abierta la puerta al criptoanálisis y, por tanto, de secreto perfecto nada de nada.
Es decir, en el caso de que se cometa el error de reutilizar la clave, un criptoanalista que se haga con dos criptogramas cifrados con la misma clave puede obtener los textos en claro correspondientes sin demasiados problemas utilizando la técnica ‘crib dragging’.
Pero, ¿cómo?. Si se utiliza la misma clave (K) para cifrar dos textos en claro (M1 y M2) resulta que:
- C1 = M1 ⊕ K
- C2 = M2 ⊕ K
Si hago XOR de ambos criptogramas (C1 y C2):
C1 ⊕ C2 = M1 ⊕ K ⊕ M2 ⊕ K = M1 ⊕ M2
Con lo que, con independencia de la clave utilizada (K), si voy deduciendo o infiriendo partes de uno u otro de los textos en claro (‘cribs’) iré obteniendo las partes correspondientes del otro mensaje en claro.
En resumen, como creo que mi amigo ha reutilizado la clave, para atacar este cifrado y descubrir los mensajes en claro correspondientes a ambos criptogramas se puede actuar de la siguiente manera:
1.- Realizar la operación ⊕ de los dos criptogramas.
2.- Intentar deducir parte de un palabra, una palabra completa o varias palabras que probablemente aparezca/n en uno de los dos textos en claro y codificar la parte inferida (‘crib’) como una cadena hexadecimal (los criptogramas dados están codificados en hexadecimal).
3.- Realizar la operación ⊕ de la ‘crib’ en hexadecimal a partir de la primera posición del resultado de la operación ⊕ realizada a los dos criptogramas.
3.1.- Si el resultado obtenido es un texto legible puedo pensar que, efectivamente, la ‘crib’ empleada aparece en uno de los textos en claro y que he obtenido la parte del texto en claro correspondiente a ésta en el otro texto en claro, e intento adivinar otra ‘crib’ repitiendo el punto 3.
3.2.- Si el resultado no es un texto legible, realizo una operación ⊕ de la ‘crib’ en hexadecimal a partir de la siguiente posición del resultado de la operación ⊕ realizada a los dos criptogramas.
Para llevar a cabo todo lo anterior recomiendo utilizar la siguiente herramienta de ‘crib dragging’ interactiva:
- C1 ⊕ C2:
- Deducir una 'crib', es decir, parte de un palabra, una palabra completa o varias palabras que probablemente aparezca/n en uno de los dos textos en claro, con la que se obtenga un texto legible en las mismas posiciones del otro texto en claro, y repetir este proceso con las 'cribs' que sean necesarias hasta obtener los textos en claro correspondientes a los dos criptogramas.
Crib = "SECRETO PERFECTO":
Crib = "EL SECRETO PERFECTO":
Crib = "CIFRAR":
Crib = "EL SECRETO PERFECTO SE PRODUCE CUANDO EL TEXTO":
Y así sucesivamente; ir adivinando más partes de palabras, palabras completas y/o varias palabras que probablemente aparezca/n en uno de los dos textos en claro hasta conseguir descifrar ambos criptogramas, ejercicio que dejo a quien esté interesado en resolver completamente este reto y/o en el manejo de la herramienta utilizada.
Y, finalmente, a medida que se vayan descifrando los dos criptogramas o una vez descifrados completamente ambos se puede ir obteniendo la clave de cifrado parcial o totalmente, respectivamente, sin más que realizar la operación ⊕ entre la parte hallada de uno de los dos textos en claro y la misma parte del criptograma correspondiente. Ejemplo:
Con lo que la solución a este reto, que está en la clave, es: CLAUDE_SHANNON.
******** PRÓXIMO RETO
Reto 39: "Geheim!".
Comentarios
Publicar un comentario