lunes, 13 de noviembre de 2017

Criptografía (LXVII): Solución Reto 3

El  enunciado del tercer reto que puse en este post era el siguiente: "El pasado 25 de julio fue el cumpleaños de un amigo mío, y tras felicitarle le pregunté cuantos años cumplía, pregunta a la que no me quiso responder y ante la cual esbozó una sonrisa. Al llegar a casa mi amigo me envió un correo electrónico con el texto asociado al reto. ¿Me puedes ayudar a saber qué edad tiene mi amigo?".

Este reto es de criptografía y su solución es:

1.- El primer criptograma que aparece en el texto del correo asociado al reto está formado sólo por caracteres alfabéticos en mayúsculas, lo que nos puede indicar que se ha utilizado un método clásico para cifrar el texto en claro.

Para intentar conocer el tipo de método empleado calculamos el Índice de Coincidencia (IC) del criptograma (ver este post donde lo explico), ya que esto nos puede ayudar a determinar si el criptosistema empleado es de transposición o de sustitución monoalfabética simple, o si por el contrario pudiera tratase de uno de sustitución polialfabética o de otro tipo.

Si fuera uno de transposición o de sustitución monoalfabética simple, o incluso una combinación de ambos tipos de cifrado, el IC (probabilidad de que dos letras escogidas al azar de un texto resulten ser la misma) del idioma en el que está escrito el texto en claro se habrá trasladado al criptograma (C).

= "PEEIHNÑEFEFAGEFEÑOVEPOVSHXGNWAGINPDSDHQSLGÑSUNHFUYHUHUPJ
CRDOPHGLDNWMIUREJMRTRYHOVIHNHOCCÑAYIRAUAGIUCLFUETEÑSLKWIHNW
IERLPWSIRDMD"

Por tanto, calculamos IC(C): 0,0441.

Este IC está muy alejado del que se espera encontrar en un texto escrito en español (0,0775), idioma en el que supongo que mi amigo escribió el texto en claro, y también de otros idiomas (inglés,...), por lo que podemos descartar la transposición y la sustitución monoalfabética simple como tipos del criptosistema empleado.

2.- Llegados a este punto, vamos a intentar comprobar si el método se corresponde con un sistema de sustitución polialfabética con clave periódica.

Para ello utilizamos el método Kasiski para atacar cifrados de este tipo (ver post donde lo expliqué). Recordar que para ello se trata de localizar secuencias de tres o más caracteres repetidas en el texto cifrado o criptograma, lo cual significaría casi con toda probabilidad que dichas secuencias no sólo eran la misma antes del cifrado sino que además la clave debió coincidir en la misma posición.

Ya conté en el post al que he hecho referencia cómo se hace esto a mano, pero en este caso usaré un software (CriptoclasicosV2.1).
Como se observa en la figura anterior (la ventana está recortada para mostrar únicamente los datos que interesan en este momento; más adelante se muestra la ventana completa), tras introducir el criptograma, el software detecta varias secuencias de caracteres repetidas e indica la separación entre las mismas, y propone que la longitud de la clave puede ser de 6 caracteres, mcd(6, 30, 66, 78). Es decir, la longitud más probable de la clave es 6, que es el máximo común divisor o mayor número entero que divide a todos esos números (separaciones) sin dejar resto.

¿Puede ser Vigenère el método de cifrado utilizado (ver este post donde lo explico)?. Pues sí, y vamos a comprobarlo con el mismo software.
Tras el análisis de frecuencias realizado en cada uno de los 6 subcriptogramas, el software propone como clave "DECPDA", pero en el texto en claro, aunque parcialmente descifrado (casi completamente), se observa que la cuarta posición de la clave no es correcta, y es fácil darse cuenta de que la clave correcta es "DECADA". Modificamos la clave y volvemos a descifrar el criptograma.
Y se obtiene el siguiente texto en claro:

"NACIENLADECADADELOSAÑOSSETENTADELPASADOSIGLOSNEFRUFUEUNFARAONDELANTIGUOEGIPTOYELTIENELACLAVEPARADESCIFRARELSIGUIENTECRIPTOGRAMA"

Es decir:

"NACI EN LA DECADA DE LOS AÑOS SETENTA DEL PASADO SIGLO SNEFRU FUE UN FARAON DEL ANTIGUO EGIPTO Y EL TIENE LA CLAVE PARA DESCIFRAR EL SIGUIENTE CRIPTOGRAMA".

3.- Con este dato ya sé que mi amigo nació entre los años 1970 y 1979, es decir, que tiene entre 38 y 47 años, y, además, me queda claro que se ha puesto muy críptico. ¿A qué se referirá con eso del tal Snefru?.

Pues bien, tal y como nos cuenta wikipedia, Snefru fue el primer faraón de la dinastía IV del Imperio Antiguo de Egipto, pero, si se investiga un poco más, también es el nombre que  le dio su inventor, Ralph Merkle, a una función hash criptográfica.

La segunda cadena que aparece en el correo de mi amigo: "8735f04f7d38955fa9a11e6265f11b16" tiene una longitud de 32 caracteres hexadecimales o, lo que es lo mismo, 128 bits. Por tanto, me queda claro que puede tratarse de un hash obtenido con el algoritmo Snefru 128.

Para intentar ver el texto en claro acudimos a una web especializada en dicho algoritmo y que supongo que es la que utilizó mi amigo para obtener ese hash, lo introducimos y vemos que se corresponde con:

"MI AÑO DE NACIMIENTO ES UNO DE LOS DE LA PRIMERA MITAD DE LOS AÑOS SETENTA. EL SIGUIENTE CRIPTOGRAMA ESTÁ CIFRADO CON EL ALGORITMO RSA Y EL PRODUCTO DE LOS DOS NÚMERO PRIMOS QUE HAN SERVIDO PARA GENERAR EL PAR DE CLAVES, PÚBLICA Y PRIVADA, ES 52.841, Y LA CLAVE PÚBLICA ES 7".

4.- Bueno, ya tenemos otro dato más; mi amigo nació entre 1970 y 1974 (por tanto, tiene entre 43 y 47 años de edad), pero además nos da información sobre el criptosistema empleado para cifrar el último criptograma, RSA, y la información pública de la clave, que efectivamente la tenía Snefru, es decir, el módulo y su clave pública.

El problema es que sólo él puede descifrar un criptograma cifrado con su clave pública, porque sólo él dispone de la clave privada correspondiente a la primera.

Por tanto, no queda otra opción que intentar obtener la clave privada de mi amigo con la información que nos da. Esto no sería posible en un tiempo mínimamente razonable, por mucha potencia de cálculo de la que se disponga, si mi amigo hubiera utilizado un número lo suficientemente grande para el módulo, pero yo creo que al final se apiadó de mí y utilizó un número muy pequeño y, por tanto, que se puede factorizar de forma casi inmediata (por ejemplo con el método de factorización Rho de Pollard. Ya expliqué en este post cómo hacerlo, pero voy a utilizar otro software para ello, Simulación de la Fortaleza de Cifrados).
Como se puede apreciar en la figura anterior, el software no ha tardado ni un segundo en factorizar el módulo (52.841), siendo los dos factores primos hallados 53 y 997.

Ahora estamos ya en disposición de obtener la clave privada que corresponde a la clave pública con la que mi amigo cifró el último criptograma del reto y con ella proceder al descifrado. También expliqué como calcularla en este post, pero también voy a utilizar un software para ello (genRSA).
Introduciendo los dos factores primos hallados anteriormente (p = 53 y q = 997) y la clave pública (e) = 7, el software nos da como resultado la clave privada (d) = 7399.

Y con este último dato ya estamos en condiciones de responder a la pregunta del reto. Para ello, acudimos otra vez al software Simulación de la Fortaleza de Cifrados y desciframos el último criptograma, "6AE3" (en decimal, 27.363), que según mi amigo es el año en el que nació.
5.- Por tanto, si mi amigo nació en el año 1974, la solución al reto 3 es que el 25 de julio de 2017 cumplió: "43 años".

******** PRÓXIMO RETO
Reto 4: "La llave inglesa".

No hay comentarios:

Publicar un comentario