Cifrado adaptativo MIMIC

Imagen de LlamameX
Enviado por LlamameX en

Foros: 

Resuelto (20/05/2012): Este reto se presentó en Kriptópolis.org el 7 de septiembre de 2011 y acaba de ser rematado por tokamak, a pase certero de sqrmatrix.

Os presento una nueva propuesta de algoritmo de cifrado. Se trata de Mimic, un procedimiento que intenta adaptarse al texto que se está cifrando a fin de dificultar el ataque. De nuevo lo que os presento es una prueba de concepto, que obviamente puede desarrollarse más a partir de la idea básica. Al final, incluyo un reto...

El Método

Para determinar la potencia del mecanismo, se mantiene simple el cifrado en sí, buscando que la dificultad de ataque provenga de la adaptación del algoritmo. La función de cifra será un XOR contra un carácter del alfabeto desordenado que se irá repitiendo (tipo Vigènere pero con XOR).

La adaptación intentará impedir que se generen las secuencias repetidas características de este tipo de codificación. Para ello se generará una nueva desordenación del alfabeto cada vez que se detecte que se cifra un carácter ya cifrado anteriormente. De este modo se elimina cualquier patrón inherente al proceso, ya que se crea una fuerte dependencia del mensaje.

Como puede deducirse la fortaleza proviene de la función de desorden y de lo caótica que ésta sea. La función empleada es dependiente de la clave, construyéndose extrayendo letras del alfabeto a desordenar según los caracteres de ésta y repitiéndose cíclicamente hasta agotar el alfabeto original. Los desórdenes posteriores del alfabeto se realizan a partir de una clave construida a partir de la inicial y de la posición del carácter en el mensaje. Así se reduce enormemente la probabilidad de repetir un alfabeto.

Tenemos como ejemplo el mensaje

EN_UN_LUGAR_DE_LA_MANCHA,_DE_CUYO_NOMBRE_NO_QUIERO_ACORDARME,_NO_HA_MUCHO_TIEMPO_QUE_VIVIA_UN_HIDALGO_DE_LOS_DE_LANZA_EN_ASTILLERO,_ADARGA_ANTIGUA,_ROCIN_FLACO_Y_GALGO_CORREDOR.

con un alfabeto base:

ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.@*,

usamos la clave SANCHO.

Generamos el primer alfabeto.

  • Para ello tomamos la primera letra de la clave, "S", que corresponde a la posición 19. Empezamos de cero; por tanto la primera letra del nuevo alfabeto será también la "S". Eliminamos la "S" del alfabeto original.
  • La segunda letra es la "A", posición 0. 19+0=19, que corresponde ahora a la "T", que añadimos y eliminamos del original.
  • La "N" nos dará 13, es decir 19+13=32, que módulo 30 (hemos quitado dos carácteres) = 2, es decir "C".
  • Con la "C" generamos la "F", con la "H" la "N" y con la "O" la ",".
  • Dado que llegamos al final de la clave, volveremos a empezar con la "S", obteniendo "X".

El resultado final será:

STCFN,XYKÑZPOQHL@*IJRWMDV_AGEUB.

Empezaremos a cifrar el texto en claro haciendo XOR con este alfabeto. Nótese que no hacemos XOR con la clave, que sería más equivalente a un Vigenere. De esta manera garantizamos una medida de bloque mínima de la longitud del alfabeto y evitamos la detección de claves cortas o débiles por análisis del cifrado.

Asi obtenemos Ci=Ai XOR Ki hasta detectar que codificamos un Aj = Ai (j>i).

Obtendremos:

C0 = A0 XOR K0 = "E" XOR "S" =  4 XOR 19 = 23 = "W"
C1 = A1 XOR K1 = "N" XOR "T" = 13 XOR 20 = 25 = "Y"
C2 = A2 XOR K2 = "_" XOR "C" = 27 XOR  2 = 25 = "Y"
C3 = A3 XOR K3 = "U" XOR "F" = 21 XOR  5 = 16 = "P"
C4 = A4 XOR K4 = "N" XOR "N" = 13 XOR 13 =  0 = "A"

En este punto detectamos que acabamos de codificar por segunda vez una "N", por lo que antes de cifrar el siguiente carácter desordenaremos de nuevo el alfabeto (partiendo del actual). La clave que usaremos será la original añadiéndole un carácter correspondiente a la posición expresada en base 32 (longitud del alfabeto) aunque, por comodidad de codificación, con los dígitos invertidos. Es decir la clave será:

"SANCHO" + (4 base 32) = "SANCHO" + "E" = "SANCHOE"

Con la que obtendremos el nuevo alfabeto:

JRC,Q.XUB*MT_FYKEÑWAPSN@VGLHOIZD

Se resetean los contadores de aparición de la Ai y se continúa el cifrado. El mensaje anterior quedará como:

WYYPAHSAH**OQJNNW.FSUDP@BNWNSEUO@WOPQWDN_,XIV.CIDOG_OEDIVARUXXHGZSCMZ.DZÑGGF
Q_DUSZZTVN_CM,W,SMRBXQJN_DMTTQVAEZCT*MQ,PÑIH_**QIRKAQA@DVKRXY_ZÑFUPYZ..VX@WS.B@
VHTP_PMESHG,GMETL_ZWTV

Las virtudes del cifrado son su alta entropía (prácticamente máxima: 4.99 sobre 5.00) y su aparente aleatoriedad (pasa el test Longrun de la batería FIPS) ya que en un texto de más de 27.000 caracteres en castellano la desviación típica no supera el 0.6%. En ese mismo test las cadenas más largas repetidas han sido de 5 caracteres y no correspondían al mismo texto claro, con lo que parece muy robusto frente a ataques de base estadística.

Como defectos, parece poco indicado para un uso manual, dada la frecuencia de las operaciones de desorden del alfabeto. Puede simplificarse este proceso sustituyendo las desordenaciones posteriores por rotaciones, lo que lo haría más asequible para un uso no mecanizado, pero aumentaría mucho la posibilidad de generar secuencias, al repetirse alfabetos.

Como ya se ha dicho la función de cifrado ha querido mantenerse simple, aunque fácilmente puede mejorarse, por ejemplo usando alfabetos distintos para calcular las posiciones de cada elemento del XOR.

Reto

A fin de poner a prueba la fortaleza del algoritmo, se ha cifrado un texto de unos 35.000 caracteres que puede obtenerse de:

Texto del reto

Igualmente puede accederse a una implementación online aquí.

A por Kriptopolis.ORG y sus kriptojuegos

Eso haré, aprovechando el verano, los calores nocturnos y demás cuestiones, empezaré por los kriptojuegos y si aguanto iré subiendo, ya sabréis más de mí, que me ilusiona pertenecer a este club de locos crípticos :)

Y de paso refresco el C que lo tengo abandonado jajajajajaja

arroba punto

Anda es verdad: donde hay la secuencia arroba punto, mete un enlace, también me pasa en el artículo de TRFR 2.0, precisamente el que subió Admin y no puedo modificar. Pero como en los archivos de descarga no se produce el fenómeno, en realidad tampoco tiene mucha importancia.

Análisis concluido

¡Quietooooos! No os abalancéis sobre mí pidiéndo que os explique cómo lo he reuelto, ni cuál es el texto oculto, ni nada de nada. Quiero decir que he terminado de analizar la salida de MIMIC para cualquier entrada, y he llegado a la conclusión de que es invulnerable a cualquier ataque sobre la estadística de las letras del cifrado. Ahora alguno estará esperando que exponga páginas y páginas de análisis de cadenas estocásticas o, al menos, de grandes tablas de resultados estadísticos que avalen mi tesis. Y yo, como colega vuestro que soy os debo una explicación, y esa explicación os la voy a dar, porque como colega vuestro que soy...

100/17 = 5.88 ~ 6

Ahí es ná, mi sedudo estudio, ¿eh? Pues bien. La cosa es como sigue:

El signo más repetido en un texto castellano es el separador o espacio, que en muchas estadísticas publicadas no figura, pero que aquí es un símbolo más del alfabeto, y tiene efecto en la transfomación de este monstruoso Proteo. Si el texto cifrado com MIMIC está en castellano, la frecuencia relativa de aparición del separador "_" será aproximadamente de un 17%, lo que quiere decir que nos encontraremos con uno de estos símbolos cada 6 caracteres, por término medio, y los que hayáis leído la descripción del algoritmo ya sabéis que cada repetición implica la activación del mecanismo de transformación del alfabeto, que es quien hace de clave. La situación aún será peor en la práctica, porque antes de que se repita un espacio podrá darse de vez encuando la repetición de alguna otra letra. Por ejemplo, en

1234567890123456789012345678901
ESTE ASESINO DE CRIPTOANALISTAS
---|--|-----| etc.

antes de que se repita el espacio, que está en las posiciones 5 y 13 (¡ocho caracteres) ya se ha repetido la E, que está en la posición 1 y 4, y la S, que está en las posiciones 2 y 7. Es decir, que tendríamos proteicas transformaciones en las posiciones 4, 7, y 13, si lo he entendido bien, que tampoco....

Esas distancias tan cortas imposibilitan cualquier estudio de frecuencias que pueda detectar siquiera cuándo se ha producido una transición, mucho menos, qué letras, planas o de la clave, han ido apareciendo.

Es decir, tenemos un estupendo OTP con clave aleatoria e infinita, alimentada por los propios caracteres del texto plano, pero de una manera inextricable. Punto y final. Enhorabuena, LlamameX, porque además de ser un magnífico analista, has encontrado un cifrado seguro, la Piedra Filosofal de todo criptógrafo. La única pega que el cifrado pueda tener es si las alteraciones del alfabeto-clave consumen mucho tiempo, haciéndolo ineficiente, de hecho se podrán producir más de las necesarias, incluso algunas consecutivas, aunque esto podría eliminarse con algún condicional que no sé si el algorimto tiene ya previsto. Pero no hay mal que por bien no venga, y ya he escrito en otro lugar que un poco de ineficiencia en un algoritmo podría ser un buen seguro frente ataques de fuerza bruta contra la clave. Otro punto y final, y ya van dos.

Bueno, cabría una forma de ataque si se dan las circunstancias adecuadas y es, como no, un ataque con texto conocido, donde las habilidades de sqrmatrix podrían ser decisivas. Esto no es una tontería, aunque yo lo diga, porque en los mensajes de la profesión suele haber encabezamientos, destinatarios, fechas, etc. que el atacante puede conocer o intuir. El mando japonés tuvo un nivel muy bajo de seguridad en sus mensajes, durante la guerra del Pacífico, porque, además de suponer que su idioma no lo hablaba nadie más que ellos, ponían unas enormes parrafadas protocolarias en los encabezamientos.

Renunciado ya a la cebada, el burro va a ver si puede enfrentarse al otro objetivo, aunque con las esperanzas algo decaídas.

Punto y final III

Ya he empezado

Pues eso, que ya he empezado a escribir lo que tengo de MIMIC. Espero no tardar demasiado en terminarlo. Tengo que refrescar la memoria, ver qué hace el código que tengo (por suerte le tengo comentarios, aunque no siempre suficientes), y explicarlo, poner ejemplos, etc. Creo que es factible un ataque, pero no estoy demasiado seguro. Quizá entre todos lo encontremos. De momento estoy escribiendo la base de ese ataque, que sería un ataque de diccionario, pero adaptado a MIMIC, aunque todavía incompleto. No sé si escribir todo hasta el final y pubicarlo de golpe, o irlo publicando según voy terminando diferentes partes. Vosotros me diréis, os doy a "eslegir".

Ataque a la clave

Supongo que te referirás a un tataque a la clave, y eso es como jugar a la lotería. Desde luego que puedo estar equivocado, pero no imagino cómo averiguar nada con fragmentos de texto de unos pocos caracteres, ya que la clave cambia cada poco.

Pensándolo bien

No he analizado la evolución de la clave para ver si se degrada y en consecuencia hay algún tipo de convergencia. Estoy seguro de que si hay alguna grieta la encontrarás

Se me está alargando la

Se me está alargando la explicación, así que hoy no podré publicar nada. A ver si esta semana, o como mucho el fin de semana que viene, lo tengo. Lo que estoy haciendo no aprovecha ninguna degradación de la clave que, por otro lado, es algo que habría que mirar. Mi ataque de diccionario no se centra sólo en la clave, sino simultáneamente en la clave y el texto claro, aunque con la intención de obtener la clave, que será mucho más corta. Aprovecho que el criptograma expresa la relación que hay entre ambos para intentar obtener ambos, hasta completar la longitud de la clave. El problema es que el cifrario complica extraer esta relación, y no sé si al final será posible. Bueno, esto lo estoy explicando con más detalle en el texto que publicaré.

Como adelanto, diré que cuando realicé el primer ataque, solamente con la intención de ver si daba algo interesante, me encontré, entre los muchos candidatos de texto-clave que encontré, éste, que me llamó la atención:

- Comienzo del texto: PLATON
- Comienzo de la clave: DEFENS

He hecho alguna tentativa de prolongar la clave a ojo, pero al final tuve que dejarlo. Lo dejé olvidado hasta ahora. Si resulta que este par texto-clave es correcto, quizá podamos cargarnos a la bestia, aunque sea a ciegas, probando a ojo claves que empiecen por DEFENS. Aunque no sea correcto este par texto-clave, llama la atención. Si descifras el criptograma con la clave DEFENS, encontrarás que el texto descifrado comienza con PLATON, y el resto es ilegible. Lo bueno de este cifrario es que si tenemos los N primeros caracteres de la clave, al descifrar obtendremos los N primeros caracteres del texto, de forma que, en caso extremo, se puede obtener la clave por tanteo. Bueno, ya tienes con qué comerte la cabeza :), aunque no hay que olvidar que esto puede estar equivocado.

Cuando explique mi análisis, quizá la gente encuentre la forma de atacarlo.

------------
Reedición:
------------
Me acabo de dar cuenta de que lo que he dicho de que si tenemos los N primeros caracteres de la clave obtenemos los N primeros caracteres del texto es falso, con lo que lo que propongo de ir obteniendo la clave a tientas no se puede (si no, el ataque sería ese, automatizado con un lemario). Perdón por la equivocación, es que lo tenía medio olvidado

SOLUCIÓN

La clave es:
DEFENSA_DE_SOCRATES

Critón

PLATON_CRITON_INTRODUCCION_EL_CRITON_ES_EL_MAS_BREVE_DE_LOS_ESCRITOS_DE_LA_PRIMERA_EPOCA_DE_PLATON._POR_SU_CONTENIDO_ESTA_MUY_PROXIMO_A_LA_APOLOGIA._SE_TRATA_TODAVIA_DE_TOMAR_DECISIONES_QUE_PUEDEN_SALVAR_LA_VIDA._ etc

Di con ello a base de probar combinaciones plausibles para la clave, no tiene más ciencia la explicación, con las pistas del gran Sqrmatrix. Renuncio a todos los parabienes por la resolución del reto. Lo ha roto Sqrmatrix, yo toqué la flauta (por casualidad) que me pusieron en los morros.

Enhorabuena

Bien hecho. Vaya, resulta que iba bien encaminado. Hice un montón de intentos en su día, pero ni se me ocurrió esa clave (mi falta de cultura en ciertos temas). Al final pensé que estaba equivocado. Gracias por demostrarme que no lo estaba, y enhorabuena de nuevo. Me ha sorprendido la rapidez con la que la has encontrado. Bueno, pondré igualmente el análisis que hice en su día, que creo que será interesante para todos. Eso sí, como de costumbre, tened un poco de paciencia, que tardaré algunos días.

Pregunta de novato

¿Alguien puede explicarme cómo se calculan las nuevas claves, SANCHOE, SANCHOL, etc? Las primeras las tengo claras, pero al probar el texto largo en la JavaScript, veo que luego empieza a añadir dos letras, y luego 3, y no sé por qué.

Muchas gracias

Enhorabuena

Creo que está llegando la hora de hacer caso al personal de la clínica, y dejar estos jueguecitos. Además han tenido que llevarme al cirujano máxilo-facial para que intentara conseguir que pudiera cerrar la boca, del pasmo que me ha dado. Y yo que lo dejaba por imposible... ¡Enfermeraaaaa!

Creo que sqrmatrix está siendo crucial para la solución de una gran parte de los enigmas. Es un placer, y un honor, compartir este sitio con vosotros.

Convergencia

Como vi este cifrado tan sólido, ni se me ocurrió hacer un AG de los míos para atacarlo, como hice con LAPYZNOS. Y probablemente hubiese tenido exito, pues a medida que la clave converge hacia la solución, también lo hacen, al menos, las primeras posiciones del texto en claro generado.

veamos:

DEFEN

PLATORNLZOYHDSMUKÑLEKY,MQOPC@URWLXYJ@M@UUDEK*.DDGGPZ@@FLQDAB*M,I.HCLFHBWCLBMQXRDOBAJMGE,YVTOF*XHXRAAA

DEFENS

PLATON.__,VDMAWL*RTGJIKYKPM,GT,BNK,@IY_REBAZWODGETQOÑFJCW*SJRQKASNYYOQP..EQCCGXJTG@HOÑEGVJYA.GYXLFAAA

DEFENSA

PLATON_BUNSUUID*AENY*IFCQBCK@WUJREJFBAYWFXNDNW@YDDHRB*GWTEFEPD*WB_@DYHLAYAJÑXW.LLHFVE*MBSTIVQZM*ÑAAAA

DEFENSA_

PLATON_CRIT,NBN*RFQHPXPMPN,ÑDZÑXMBDNREWZV*ÑAWYFR,Y,IVJAYSLYOM@IZXOOANÑDUNMVFESBBYJJDAG_NPLVERBYTLDAAA

DEFENSA_DE

PLATON_CRIJPNVEG,OOSYCM@PÑBZ@MW.BJVCYHJM@LHFP@M*EZWSZ.FFR_QLVKNOOÑ,V.WGCYAJI*Y@,ÑMPUKW@PJMOOVILIO.AAA

DEFENSA_DE_SO

PLATON_CRITINBB,OCJJH*XÑQDMTHLFAC@GTCN,LNL*VMHVRLT,HT_.CVLVMQSW__HZAV,G_JAXVPOENÑ*OCLDCRYVEIUYXSJFAAA

DEFENSA_DE_SOCRA

PLATON_CRITON_IN,FYWZDT.KSQEOCS@I*BGYZY_KL@KVS.BNQBEOSEG@U,AIKWJL_RUYY@,BAJV*ÑPEL*KPJNXKJS@*ZJJD_QAAA

DEFENSA_DE_SOCRATES

PLATON_CRITON_INTRODUCCION_EL_CRITON_ES_EL_MAS_BREVE_DE_LOS_ESCRITOS_

Está claro que este criptosistema es vulnerable a ataques con métodos heurísticos como los AGs o el Recocido simulado. Omelette era mucho menos vulnerable en este aspecto.

Gracias a Sqrmatrix y a Llamamex por este bonito reto.

Ps.

Yo creo que el problema de convergencia de la clave se puede arreglar, haciendo este sistema más sólido, es decir, hace falta MIMIC 2.0

Análisis de MIMIC. Paso 1

Aquí muestro el primer paso del análisis de MIMIC que hice (bueno, en realidad no fue éste el que hice primero, pero creo que es mejor mostrarlo el primero para entender mejor el resto de los pasos).

El cifrario MIMIC puede considerarse una forma enrevesada de cifrario XOR. Analizaremos primero cómo podemos atacar un cifrario XOR.

En un cifrario XOR, tenemos dos cadenas de texto, emparejadas carácter a carácter, y el criptograma se obtiene aplicando la función XOR a cada par de letras enfrentadas. Evidentemente, el número de caracteres que debe haber en el alfabeto debe ser una potencia de 2. Para descifrar, basta emparejar los caracteres del criptograma con los de la clave, y realizar la operación XOR.

Bien, sabemos que si la clave es aleatoria, y no disponemos de ella, es imposible determinar el texto original a partir del criptograma. La cosa cambia cuando estamos ante una clave formada por un texto (y es lo que vamos a suponer para este reto).

Para descifrar un criptograma XOR con estas características, podemos usar un ataque de diccionario. Para ello, necesitamos un lemario que disponga de todas las posibles palabras.

El ataque es muy simple, aunque también puede ser lento, y puede fracasar si aparecen palabras en el texto o en la clave que no aparezcan en el lemario utilizado.

Para facilitar las explicaciones, primero hay que definir algunos conceptos:

- "Separador": respecto de un lemario, un separador es un carácter que separa las palabras del lemario entre sí para formar un texto. Aparece antes y después de las palabras, pero no forma parte de ellas. Pueden aparecer dos o más separadores juntos, y las reglas de formación de textos (que pueden o no coincidir con las reglas gramaticales) determinarán cómo y cuándo pueden aparecer juntos. Pueden considerarse también como separadores grupos de dos o más caracteres que cumplen lo ya dicho.
- "Texto válido": respecto de un lemario y unos separadores, diremos que un texto es un texto válido si está formado por palabras del lemario separadas por separadores. El fragmento de texto puede empezar y/o terminar con separadores.
- "Fragmento de texto válido": respecto de un lemario y unos separadores, diremos que un texto es un fragmento de texto válido si es un texto válido que empieza por la parte final de una palabra del lemario, separada del texto por un separador, y/o termina en un separador seguido del comienzo de una palabra del lemario

Un texto válido es un caso especial de un fragmento de texto válido.

Como ejemplo de separadores, tenemos los propios del lenguaje castellano: " " (espacio), "," (coma), "." (punto), ";" (punto y coma), etc.. Como ejemplo de grupos de caracteres que funcionan como separadores, tenemos ". " (punto seguido de espacio), ", " (coma seguida de espacio), "..." (puntos suspensivos), etc..

Como ejemplo de textos válidos (y, por tanto, también de fragmentos de texto válidos), suponiendo como lemario las palabras del lenguaje castellano, y como separadores sus signos de puntuación y el espacio, son textos válidos: "EN_UN_LUGAR_DE_LA_MANCHA", "_DE_LA_MANCHA", "EN_UN_LUGAR_", "_LUGAR_DE_LA_MANCHA, ", etc.

Como ejemplo de fragmentos de texto válidos, con las suposiciones anteriores, tenemos los siguientes ejemlos: "EN_UN_LUGAR_DE_LA_MANC", "GAR_DE_LA_MANCHA", "GAR_DE_LA_MAN".

Puede darse el caso de que un texto sea simultáneamente un texto válido, y un texto no válido, pero fragmento de texto válido. Esto ocurre cuando el texto en cuestión comienza por una palabra que es a su vez el final de otra palabra, y/o cuando termina por una palabra que es a su vez el comienzo de otra palabra. Por ejemplo, "EN_UN_LUGAR_DE_LA_MANCHA", "EN" es el final de varias palabras, como por ejemplo, "TIENEN", y "MANCHA" es el comienzo de varias palabras, como por ejemplo, "MANCHADA". Así, el texto "EN_UN_LUGAR_DE_LA_MANCHA" puede ser tomado como texto válido, y también como fragmento de texto, que podría provenir de "TIENEN_UN_LUGAR_DE_LA_MANCHA", "EN_UN_LUGAR_DE_LA_MANCHADA", "TIENEN_UN_LUGAR_DE_LA_MANCHADA", o cualquier otra combinación de palabras que comiencen y terminen por esas palabras.

El fundamento del ataque que voy a presentar es el siguiente. Tenemos una función, "XOR", en la que se genera el criptograma "C" a partir del texto "T" y la clave "K", de la forma T XOR K=C ("T", "K" y "C" definen tanto letras como textos, todos de la misma longitud, y la operación XOR se aplica a pares de letras emparejadas de cada variable). Por otro lado, la función XOR tiene la propiedad de que conocido el valor de dos de las componentes de la anterior igualdad, podemos obtener el valor de la tercera componente haciendo XOR de las dos componentes conocidas. Por último, puesto que tanto "T" como "K" forman un texto válido, los valores que pueden tomar estarán limitados a fragmentos de texto válidos.

Visto esto, tenemos el siguiente ataque. Tomamos todos los fragmentos de texto válido, y los asignamos a una de las variables desconocidas, da igual cuál, pues son intercambiables. Supongamos que lo asignamos a la variable "T". Hallamos la operación XOR con el criptograma "C" para obtener el valor de la otra variable, en este caso "K", y comprobamos si generan un fragmento de texto válido. Aquellos fragmentos de texto que no generen un fragmento de texto válido se descartan como fragmentos de texto no válidos. Aquellos que sí generen un fragmento de texto válido se toman como candidatos del texto o de la clave, no sabemos aún si es texto o clave, y los textos que han generado también se toman como candidatos de la otra variable. Obtenemos así pares de texto y clave, que habrá que examinar para determinar cuáles son el mensaje que buscamos.

Este ataque, según se ha explicado, es impracticable (salvo textos de pocos caracteres), ya que habría que obtener todos los textos posibles de la longitud del criptograma (una cifra astronómica).

Basta observar que si tenemos un texto válido, el texto generado será también válido y, por tanto, cualquier fragmento del primer texto generará una fragmento de texto válido. Así que lo único que hay que hacer es ir obteniendo el texto palabra a palabra (o incluso letra a letra), comprobando que cada nueva palabra (o letra) genera el correspondiente fragmento de texto válido. Por otro lado, también se observa lo siguiente: supongamos que tenemos generado el fragmento de texto válido "K" mediante el texto "C", obtenido este último mediante palabras completas. Al añadir una nueva palabra a "C" (con el separador o separadores necesarios), para saber si el nuevo texto obtenido "K'" es válido, no hace falta comprobarlo entero, sino sólo a partir del último separador que tenía antes de añadirse la palabra. Para entenderlo mejor, veamos un ejemplo.

Tenemos el texto "EN_UN_LUGAR_DE_LA_MANCHA", y la clave "SANCHO_FUE_EL_ESCUDERO._", con el alfabeto del reto "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.@*,". Al hacer XOR, obtenemos el criptograma "WNVWKTPPSEJ,I,,XCÑOE,N__". Si no conociéramos ni el texto ni la clave, realizaríamos el procedimiento aquí descrito. Vamos a olvidarnos de momento de todos los candidatos, y vamos a centrarnos en las palabras del texto y de la clave. Cuando llegáramos a la palabra "EN", obtendríamos el fragmento de texto "SA", que serían candidatos. Pero también llegaríamos a la palabra "SANCHO", que generaría el fragmento de texto "EN_UN_". Centrémonos en este par de textos. El siguiente paso sería añadir a "SANCHO" otra palabra, con un separador. Acabaríamos llegando a "SANCHO_FUE", que generaría el fragmento "EN_UN_LUGA", y es aquí donde quería llegar para explicar cómo no es necesario comprobar que, al añadir la siguiente palabra, se compruebe el texto completo, sino sólo a partir del último separador. Bueno, la siguiente palabra con la que nos encontraríamos sería "EL", que al añadirla al texto que ya tenemos, obtendríamos "SANCHO_FUE_EL", y obtendríamos al hacer XOR "EN_UN_LUGAR_D". Como se ve, sólo es necesario comprobar a partir del último espacio que hemos obtenido un fragmento de texto válido, es decir, en lugar de comprobar que "EN_UN_LUGAR_D" es un fragmento de texto válido, sólo nos basta comprobar que "LUGAR_D" es un fragmento de texto válido. Igualmente, no hace falta hacer "XOR" con todas las palabras que tenemos, es decir, con "SANCHO_FUE_EL", sino sólo la parte del fragmento que necesitamos, es decir, a partir de la posición que ocupe "LUG", o sea, "_FUE_EL".

Este ataque puede mejorarse. Por ejemplo, si al hacer XOR el texto obtenido es un fragmento de texto válido que termina con el comienzo de una palabra del lemario, podemos intercambiar el texto que estábamos deduciendo por el texto que estábamos obteniendo con XOR. Ahora, tan sólo hay que probar con las palabras que comiencen por la terminación del texto que tenemos. De nuevo, esto se verá mejor con un ejemplo.

En el ejemplo anterior habíamos obtenido, con el texto "SANCHO_FUE", el texto "EN_UN_LUGA". Observamos que al final tenemos un comienzo de palabra. Pues si intercambiamos los textos, ahora buscaremos todas las palabras que comiencen por "LUGA", las añadiremos al texto, haremos XOR, y comprobaremos si genera un fragmento de texto válido. Tenemos las palabras "LUGANO", "LUGAR", "LUGAREÑO", etc. Al probar con "LUGANO" (que, como todo el mundo sabe, es un ave paseriforme :) ), obtenemos "SANCHO_FUEEP", que no es un fragmento de texto válido, porque no existe la palabra "FUEEP", ni ninguna palabra comienza por "FUEEP". La siguiente es "LUGAR", que genera el texto "SANCHO_FUE_", que sí es un fragmento de texto válido. "LUGAREÑO" genera el texto "SANCHO_FUE__GP", que tampoco es un fragmento de texto válido, porque ninguna palabra comienza por "GP" (y si no estuvieran permitidos los dobles espacios, eso también descartaría "LUGAREÑO" como palabra válida).

Cuando nos encontramos en el texto obtenido con XOR con un texto válido, es decir, que termina con una palabra del lemario (si tenemos tanto una palabra, como el comienzo de una palabra, el caso del comienzo de una palabra se trató en el ejemplo anterior, y aquí se explica el caso de la palabra completa), lo que tenemos que hacer es añadir al texto (en este caso, nos da igual cuál de los textos tomemos, porque la operación será la misma) todas las combinaciones de separadores permitidas, y ver si el texto generado es un fragmento de texto válido. En caso de que el separador coincidiera en texto y en clave, la función XOR generó el valor 0 (ya que se está haciendo XOR de dos valores iguales), lo que significa que al probar con un separador (o cualquier carácter), obtendremos el mismo separador al hacer XOR, lo cual es válido, y tendremos que ramificar los intentos. En este caso, si los separadores tienen ciertas reglas, se utilizarán para intentar reducir las ramificaciones.

Veamos otro ejemplo de lo dicho. Supongamos ahora el fragmento de texto válido "ERA_UN_LUGAR_DE_LA_MANCH", con la misma clave y alfabeto de antes. Al probar con la palabra "SANCHO", obtenemos "ERA_UN", que termina con la palabra válida "UN" (suponemos comprobadas todas las palabras que comienzan por "UN"). En este caso, probaríamos con todas las combinaciones de espacios permitidas. "_", "," y "." nos generarían los mismos separadores (ya que al coincidir en el texto y la clave el mismo carácter, el criptograma tendrá en esa posición el valor 0, y la operación XOR de un valor con 0 da como resultado el mismo valor), lo cual es válido. No obstante, si suponemos como norma que en los textos tanto el punto como la coma van seguidos de espacio, podemos probar las combinaciones "._" y ",_", que en este caso generan "ERA_UN.U" y "ERA_UN,U", que no siguen la norma de coma o punto seguido de espacio (en este caso, nada nos asegura que todos los puntos y las comas tengan que estar seguidos de espacio, pero es una pista más).

Este ataque no nos garantiza el éxito, pues es necesario que todas las palabras que aparecen tanto en el texto como en la clave estén también en el lemario utilizado. Es posible también que se generen muchas ramificaciones (esto es, muchos fragmentos de texto válidos que analizar), lo que gasta mucho tiempo y memoria. Todavía no he probado este ataque en un caso real, pues tampoco lo he implementado completamente. En el caso de que aparezcan palabras que no estén en el lemario, siempre se pueden registrar los progresos hechos para echarles un vistazo manualmente. La intuición del criptoanalista puede determinar la palabra que falta. Y si no, siempre se pueden saltar unos caracteres del criptograma para iniciar un nuevo análisis en el resto del criptograma que queda.

En este último caso, como no sabemos dónde empieza la siguiente palabra, habrá que realizar un tanteo. Se selecciona una posición a partir de la cual analizar, se realiza el análisis indicado antes, y si no progresa, se pasa a la siguiente posición, así hasta encontrar un fragmento de texto válido (en este caso, el nuevo fragmento de texto obtenido con XOR puede no empezar con una palabra completa, sino con el final de una palabra, a diferencia del análisis realizado al principio del criptograma). En este caso, aunque no se empiece en una posición válida, con el avance del análisis es muy probable encontrar un separador en la posición correcta, ya que la probabilidad de encontrar un separador en la misma posición en dos textos diferentes es relativamente muy alta, y a partir de ese separador, el análisis se realiza en el comienzo de una palabra del texto o de la clave.

El mayor problema que presenta este ataque es que haya palabras en la clave y/o el texto que no tengamos en el lemario. Los lemarios que existen no tienen conjugaciones verbales, plurales, géneros, prefijos ni sufijos. Cuando me puse a realizar el primer ataque, lo que hice fue coger todos los lemarios que encontré, y construir uno con todas las palabras de todos. Después, me construí unas funciones en Java para obtener plurales, géneros y conjugaciones verbales de verbos regulares, todo esto aplicado a todas las palabras. Para los géneros, añadía a la palabra "S", "ES", etc, según las normas generales de formación de plurales. Para los géneros, si la palabra terminaba en "A", la cambiaba por "O" y viceversa, y no recuerdo si alguna otra operación. Para los verbos, cogía las palabras que terminaban en "AR", "ER" o "IR", y obtenía la conjugación suponiendo que fueran verbos regulares. De cada uno de ellos obtenía más de 3000 combinaciones (no todas correctas, por supuesto). Mi idea era obtener todas las posibles palabras a partir de las del lemario, para construir un superlemario que abarcara un buen porcentaje de todas las posibles palabras. Interrumpí el proceso cuando ví que el archivo que estaba generando ocupaba 90 MB y todavía estaba con las letras que empezaban por "A". Java no puede manejar tanta información en memoria, y manejarla con accesos a disco haría el proceso muy lento. Para solventar este problema se me ocurrió una idea que al final no llevé a cabo, y era mantener la lista de las palabras del lemario original, pero a la hora de realizar las consultas, de cada palabra consultada se obtendrían todas las palabras derivadas y se realizarían las consultas a esas palabras obtenidas. El proceso seguiría siendo lento, pero seguramente menos lento. Lo que no hice fue obtener palabras con prefijos y sufijos. Pensaba hacerlo más tarde, cuando probara lo anterior.

Este ataque puede generalizarse a otros cifrarios que tengan ciertas características:

Si tanto el mensaje como la clave son textos, basta con que cumpla el cifrario esta característica:
- Si C(i)=f(T(i),K(i)) es la función que obtiene el carácter del criptograma "C(i)" a partir del carácter del texto "T(i)" y el carácter de la clave "K(i)", deben existir funciones f' y f" tales que T(i)=f'(C(i),K(i)) y K(i)=f"(T(i),C(i))

Si el mensaje y/o la clave no son textos, además de la anterior característica deben cumplir la siguiente:
- El mensaje y la clave deben estar formados por concatenaciones de caracteres que sigan unas reglas que limiten las posibles combinaciones formadas para que puedan ser deducidas por el procedimiento explicado sin presentar demasiadas ambigüedades (el procedimiento consistiría en ir deduciendo los textos carácter a carácter, o mediante grupos de caracteres, y si hay grupos de caracteres prohibidos, servirán para descartar combinaciones utilizadas)

Un ejemplo de cifrario al que se puede aplicar este ataque es el Vigenère, sobre todo cuando la clave es un texto muy largo.

En el cifrario MIMIC encontré unas vulnerabilidades que me hicieron pensar que quizá podría obtener estas funciones f' y f" y, con ello, aplicar este ataque. Esas vulnerabilidades las mostraré en el siguiente paso. No conseguí obtener estas funciones, salvo parcialmente.

Como he dicho, no he aplicado este ataque a un caso real, y no sé si será muy efectivo. Algo efectivo sí es, porque ha permitido resolver el reto.

Me interesa

La verdad es que me interesa la idea que planteas. El problema de mi método es que puede resultar muy lento, y puede fallar con facilidad. Basta que aparezca una palabra inexistente en el lemario, y ya empiezan los problemas.

Yo creo que el alcance de

Yo creo que el alcance de esta explicación trasciende el ámbito de Mimic y merecería constituir, por sí misma, un artículo de kriptópolis sobre el criptoanálisis mediante texto conocido.

Es exhaustiva y, al contrario que otras con demasiado aparato matemático y de programación, muy ilustrativa y fácil de leer. Una joyita para kriptópolis, vamos. A mi me ha dado algunas ideas.

Verbos

Me ha hecho gracia la construcción de las conjugaciones de los verbos. Hace la tira de años (13 ó 14) me enfrenté a un problema similar: necesitaba una base de datos con verbos conjugados, que no existía por ninguna parte (quería construir un parser para analizar oraciones)
Así que me descargué un programa que los conjugaba (pero sólo mostraba en pantalla el resultado), y me hice un programita que leía de una base de datos y enviaba pulsaciones al teclado, para alimentar al programa con los verbos de una base de datos.
Entonces recogía los resultados del portapapeles (enviaba las teclas CTRL+C) para, al fin, guardar las conjugaciones en una base de datos. Total 500.000 registros, comenzando por las formas de "ababillar", con todas las conjugaciones de miles de verbos. Lo consiguió en una semana de funcionamiento.
Ese inmenso (e inútil) trabajo que guardaba como monumento a la ociosidad, podrá ser ahora utilizado para el mal gracias a la inspiración de sqrmatrix...

Parser

En otros tiempos también estuve en el negocio de los parsers. Cuánto hubiera dado entonces por tener a mano tu maxi-mega fichero de 500.000 registros. ¿Sería mucho pedir que lo subieras? Que conste que lo comprenderé, si te niegas.

Ataque a la clave, para la imprenta

Como siempre, sqrmatrix nos da valiosísimas lecciones de criptoanálisis. Estoy de acuerdo en que sus trabajos deberían formar una sección aparte.

Sqrmatrix no suele terminar los retos porque no se molesta en aplicar sus propios análisis. En cuanto los termina ya está en otra cosa.

La gran debilidad de MIMIC, que yo no supe ver, es que una clave imperfecta proporciona un descifrado parcial. cosa que no ocurre con TFTR -ni con ACYNOS-. De modo que bastaba con ir probando, como quien pesca en un estanque, que es lo que hizo Tokamak.

A sqrmatrix, en vez de camiseta, habría que hacerle un traje.

P.S.
Por cierto, sqrmatrix. ¿podrías colgar ese lemario de lemarios?

Ese lemario de lemarios no lo

Ese lemario de lemarios no lo he completado. Me quedé en los 90MB, como dije, y todavía estaba por las palabras que empiezan por "A". Por otro lado, la velocidad de mi conexión es muy lenta, y tardaría varios días en subirlo (un cálculo a ojo echa 90MB*26 letras=2340MB=2.3GB, calculo que unos 5 días de subida ininterrumpida, a la velocidad de mi conexión (sí, es una patata de conexión, pero es la única que puedo tener por el momento)). Lo que sí puedo hacer es explicar cómo expandí las palabras de los lemarios que tenía, y así podrías implementarlo. Puedo incluso colgar el código Java con el que las obtenía, aunque no sé si conocerás ese lenguaje. También los sitios donde conseguí los lemarios. Si te parece bien, hago eso.

La verdad es que no lo dejé.

La verdad es que no lo dejé. Realicé numerosos intentos para obtener la clave, pero la intuición no es lo mío, y la cultura clásica menos. Al aplicar como clave "DEFENSA_DE_", obtenía como texto "PLATON_CRIT". La palabra "CRITON" no la tenía en el lemario, y ni siquiera la conocía. Probé con todas las palabras que empezaban por "CRIT" (que tenía en el lemario), y no obtuve nada. Tapoco se me ocurrió añadir "SOCRATES" (mi falta de cultura clásica). Pensé que mi análisis tenía un error, pero como no lo encontraba, y no conseguía nada con mis pruebas, lo dejé, hasta que se me ocurriera algo. El método que utilicé me dio "DEFENS" y "PLATON", como ya dije. Empecé a pensar que esto fue una simple casualidad y no tenían que ver con la clave y texto reales, y en caso de no ser error, pensaba que la clave no podía empezar por "DEFENSA_DE_", sino por una palabra que empezara por "DEFENS" (que también las probé todas las que tenía). Probé diferentes combinaciones de separadores, etc, y ningún resultado. Por eso lo dejé aparcado, porque ya había probado todo lo que se me había ocurrido, y no se me ocurría nada más. Mi error fue no compartir mis hallazgos con los demás, error que intentaré no cometer más.

Análisis de MIMIC. Paso 2

Aquí veremos una vulnerabilidad, pero que no es explotable completamente con los análisis que hice.

Recordemos que se iban creando alfabetos desordenados cada vez que se encontraba una letra repetida en el texto claro en cada fragmento al que se aplicaba cada alfabeto desordenado.

La vulnerabilidad consiste en que si tenemos dos alfabetos desordenados consecutivos (es decir, de dos fragmentos de texto consecutivos, encriptado cada uno con un alfabeto), podemos obtener la clave. Simplemente hay que seguir los pasos para conseguir el alfabeto desordenado de forma inversa. Es posible obtener diferentes candidatos a la clave, pero si se descifra el criptograma con cada candidato, el que sea la clave correcta será el que consiga un texto con más palabras del lemario. El procedimiento es el que sigue.

Escribimos el alfabeto ordenado, debajo el primer alfabeto desordenado (al que llamaremos alfabeto 1), y debajo el segundo alfabeto desordenado (al que llamaremos alfabeto 2). Tomemos, del ejemplo dado en la exposición de MIMIC, los alfabetos "JRC,Q.XUB*MT_FYKEÑWAPSN@VGLHOIZD" y "APC.FDYUBLIMRNVGWHTEKX*O,Q@JZ_SÑ". Recordemos que la clave era SANCHO. Colocamos los alfabetos como hemos dicho:

"ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.@*,"
"JRC,Q.XUB*MT_FYKEÑWAPSN@VGLHOIZD"
"APC.FDYUBLIMRNVGWHTEKX*O,Q@JZ_SÑ"

Recordemos que, para obtener el alfabeto desordenado, lo que se hacía era:

1.- Establecemos el puntero del alfabeto 1 "pAlf" a 0, y el puntero de la clave "pClave" también a 0. El alfabeto 2 lo creamos inicialmente vacío
2.- Localizamos la letra de la clave en "pClave" en el alfabeto ordenado. A "pClave" le sumamos 1 y el resultado le hacemos módulo la longitud de la clave
3.- Sumamos a "pAlf" la posición calculada en el paso anterior, y al resultado hacemos módulo la longitud del alfabeto 1
4.- La letra en el alfabeto 1 en la posición "pAlf" la añadimos al alfabeto 2
5.- Eliminamos del alfabeto 1 la letra en la posición "pAlf"
6.- Repetimos en el paso 2 hasta que el alfabeto 1 se vacíe

Recordemos que a la clave original se le añaden caracteres pseudoaleatorios en cada cálculo del alfabeto 2.

Podemos seguir los pasos a la inversa.

En el cálculo de la primera letra del alfabeto 2 partimos de la posición 0 del alfabeto 1. Basta localizar en el alfabeto 1 la posición que ocupa esa letra, y buscamos en el alfabeto ordenado la letra en esa misma posición. Esa letra será la primera letra de la clave.

En el ejemplo, la primera letra del alfabeto 2 es "A". En el alfabeto 1, la letra "A" está en la posición 19. En el alfabeto ordenado, en la posición 19 está la letra "S", así que la tomamos como primera letra de la clave.

Una vez obtenida la primera letra del alfabeto 2, se eliminaba la letra del alfabeto 1. Haremos lo mismo aquí, con lo que nos quedaría el alfabeto 1 como:

"JRC,Q.XUB*MT_FYKEÑWPSN@VGLHOIZD"

La siguiente letra se calculaba sumando, a la posición que ocupaba la letra del alfabeto 1 que hemos eliminado, la posición de la siguiente letra de la clave en el alfabeto ordenado. Así, pues, para obtener la siguiente letra de la clave, tendremos que determinar la posición de la siguiente letra del alfabeto 2, restarla de la posición de la letra que eliminamos antes, y el resultado será la posición de la siguiente letra de la clave en el alfabeto ordenado.

Siguiendo el ejemplo, vemos que la siguiente letra del alfabeto 2 es "P". En el alfabeto 1, esta letra ocupa la posición 19. Restando a la posición que tenía la letra que eliminamos antes, que también era 19, obtenemos como resultado 0. En el alfabeto ordenado, la letra que ocupa la posición 0 es la "A", que tomamos como siguiente letra de la clave. Ya tenemos las letras "SA" para la clave.

El problema se nos presenta ahora, porque el alfabeto 1 tiene longitud 31, mientras que el alfabeto ordenado tiene longitud 32. Si la letra de la clave que hemos hallado hubiera sido "," en lugar de "A", como ocupa la posición 31, en el procedimiento para obtener el alfabeto 2 nos hubiera dado la misma letra "P" como segunda letra, ya que al sumar a 19 el valor 31, al hacer módulo 31 (ya que habíamos eliminado una letra y tenía, por tanto, longitud 31), obtenemos igualmente el valor 19, dando el mismo resultado, aunque la clave es diferente. Podemos generalizar esto. Si "d" es la distancia entre la letra actual del alfabeto 2 y la anterior, referidas al alfabeto 1, y "L" es la longitud actual del alfabeto 1, sabemos que si tomamos en el alfabeto 1 la posición d+k*L, "k" un entero cualquiera no negativo, dará como resultado siempre la misma posición en el alfabeto 1. Así, pues, si la letra en el alfabeto ordenado ocupa la posición "d", todas las letras en el alfabeto ordenado que ocupen la posición d+k*L<32 serán candidatas a la clave. En este caso, la letra "A", que ocupa la posición 0+0*31<32, y la letra ",", que ocupa la posición 0+1*31=31<32. A medida que se va haciendo más pequeña la longitud del alfabeto 1, se van obteniendo en cada paso más letras candidatas, lo que va ramificando las claves candidatas.

El siguiente paso es eliminar, del alfabeto 1, la letra "P". A pesar de haber 2 letras candidatas a letras de la clave, sólo se elimina esta letra, porque ambas letras de la clave llevan a la misma letra "P" en el alfabeto 1. Nos queda, pues, el alfabeto:

"JRC,Q.XUB*MT_FYKEÑWSN@VGLHOIZD"

Y tenemos los inicios posibles de las claves: "SA" y "S,"

En este punto podemos pensar en aplicar un lemario para ir descartando claves no válidas, aunque esto sólo es posible si la clave forma un fragmento de texto válido. No obstante, la clave tiene al final caracteres pseudoaleatorios que harán que el análisis con lemario falle. Si conociéramos en qué posición se calculan los alfabetos, sabríamos la longitud de esos caracteres extra, ya que estos caracteres son la representación de la posición en la que estamos en base 32, por lo que el número de caracteres añadidos sería int(log(posición)/log(32))+1. Así, conocido el número de caracteres añadidos, a los candidatos les quitaríamos estos últimos caracteres y ya podríamos aplicar el análisis del lemario. Si resulta que los candidatos tienen una longitud menor o igual que estos caracteres extra, tenemos la seguridad de que estamos ante los primeros caracteres de la clave, ya que se supone que no puede estar vacía.

Pasemos al siguiente paso. La tercera letra del alfabeto 2 es "C". En el alfabeto 1 esta letra ocupa la posición 2. Al restarle la posición anterior, que era 19, obtenemos -17, que módulo 30 (la longitud que tiene ahora el alfabeto 1) es 13. En el alfabeto ordenado, la letra que ocupa la posición 13 es "N". Puesto que 13+1*30=43>32, no hay más letras candidatas, por lo que tenemos los candidatos a clave "SAN" y "S,N". Eliminando esta letra "C" del alfabeto 1, tenemos:

"JR,Q.XUB*MT_FYKEÑWSN@VGLHOIZD"

La siguiente letra del alfabeto 2 es ".", que en el alfabeto 1 se encuentra en la posición 4. Restando a la posición anterior, que era 2, nos queda 2, que en el alfabeto ordenado es la letra "C". Como 2+1*29=31<32, también es candidata la letra ",", que ocupa la posición 31 en el alfabeto ordenado. Tenemos los candidatos a clave "SANC", "SAN,", "S,NC", "S,N,".

Si seguimos así, obtendremos numerosos candidatos. Puesto que tenemos 32 letras en el alfabeto, todos estos candidatos tendrán al final 32 letras. Si el doble de la longitud de la clave más el número de los caracteres aleatorios añadidos es menor o igual a la longitud del alfabeto ordenado, entonces uno de los candidatos tendrá repetida la clave, ya que en el proceso de obtener el alfabeto 2, si se llega al final de la clave, se vuelve a empezar. Esto puede ser una ayuda para saber cuál de los candidatos es la clave, incluso cuando la clave sea aleatoria. En caso de que no se cumpla que el doble de la longitud de la clave más el número de los caracteres aleatorios añadidos sea menor o igual a la longitud del alfabeto ordenado, la clave no se repetirá, pero sí podrán repetirse los primeros caracteres, tantos menos cuanto más larga sea la clave, y esto todavía podría ayudarnos.

El problema de este proceso es que no tenemos dos alfabetos desordenados consecutivos. Sin embargo, cuando empezamos la encriptación del texto, al obtener el primer alfabeto desordenado de todos, utilizamos como alfabeto 1 el alfabeto ordenado, con lo que en ese punto, uno de los alfabetos ya lo tenemos. Simplemente tenemos que obtener el siguiente y, una vez obtenido, podremos obtener la clave. Además, en este punto a la clave no se le han añadido caracteres extra, por lo que se puede aplicar directamente el análisis con el lemario.

Todo esto se verá en el siguiente paso.

Análisis de MIMIC. Paso 3

Es en este paso donde se aplicará lo explicado en el paso 1. No tenemos una función XOR simple. Tenemos la función de cifrado f(T,K)=C y la función de descifrado f"(C,K)=T. No tenemos la función f'(T,C)=K. No obstante, tenemos parte de esta función. Recordemos que en el paso anterior determinamos cómo obtener la clave teniendo dos alfabetos consecutivos. También vimos que, al comienzo del criptograma, tenemos uno de los alfabetos, que es el alfabeto ordenado.

Si conociésemos el texto en claro, podríamos obtener los caracteres del alfabeto desordenado simplemente haciendo XOR entre las letras del criptograma y las del texto claro. Recordemos que, cada vez que se repetía una letra del texto claro, se obtenía un nuevo alfabeto desordenado, lo que nos limita a obtener las primeras letras del alfabeto desordenado, hasta que se repita una letra en el texto claro.

Por tanto, nos centraremos en los primeros caracteres del texto claro, hasta que se repita una letra, porque esos caracteres nos permitirán obtener los caracteres del alfabeto desordenado consecutivo al alfabeto ordenado. A partir de ellos, podremos obtener las primeras letras de la clave siguiendo el procedimiento explicado en el anterior paso.

Para estas primeras letras del texto, tenemos las funciones f(T,K)=C (función de cifrado), f"(C,K)=T (función de descifrado) y f'(C,T)=K (obtención de la clave). Podemos, pues, aplicar lo explicado en el paso 1. Tomamos un lemario, y recorremos todas sus palabras.

Ahora, vamos palabra por palabra. Dada una palabra, la suponemos palabra de la clave. Desciframos el criptograma con ella (sólo las letras necesarias, no todo el criptograma). Si el comienzo de la clave es correcto, obtendremos el comienzo del texto claro. No hay que olvidar que, si el texto tiene una letra repetida, ese texto es válido sólo hasta encontrar la primera letra repetida. Lo que haya a continuación de esa letra repetida hay que eliminarlo. Hay que recortar, igualmente, la clave para que tenga las mismas letras que el texto. Si no tuviera letras repetidas, el texto entero obtenido es válido.

Una vez eliminada la parte sobrante (si la hay), comprobamos las letras obtenidas para el texto claro. Si forman un fragmento de texto válido, el fragmento de palabra que tenemos para la clave y el fragmento de texto obtenido son candidatos a ser un fragmento de par texto-clave válido. Si no, descartamos esa palabra (la palabra entera) como comienzo válido de la clave. Si hemos tenido que recortar la clave, nos saltaremos todas las palabras que comiencen por el texto que tenemos de la clave, ya que todas, en el mismo punto, serán recortadas, dando el mismo resultado.

Una vez recorridas todas las palabras del lemario, aplicamos lo visto en el paso 1, es decir, si el texto claro candidato o la clave terminan por el comienzo de una palabra, probamos a completarlos con todas las palabras que tengan ese comienzo. Si ambos terminan por una palabra completa, añadimos a la clave o al texto un separador, y comprobamos si la otra parte tiene también un separador, etc. Hay que tener en cuenta que al construir el texto (no la clave) con esas palabras, si el texto obtenido tiene una letra repetida, eliminamos lo que haya a partir de esa letra repetida. Evidentemente, si el texto ya tiene una letra repetida, no podemos añadirle nada más, así que lo guardamos como candidato y pasamos al siguiente.

Para obtener la parte de la clave asociada al texto claro, hay que hacer XOR de las letras del texto con las correspondientes letras del criptograma. Esto nos dará las primeras letras del alfabeto desordenado que, como es consecutivo del alfabeto ordenado, podemos aplicar lo visto en el paso anterior para obtener las primeras letras de la clave.

Fue aquí donde encontré el par texto claro-clave que permitió resolver el reto, y fue hasta este paso donde hice pruebas. Tenía otra idea más que no logré desarrollar y que explicaré en el siguiente paso.

Análisis de MIMIC. Paso 4

En este cuarto y último paso describiré la idea que tenía en mente para seguir desarrollando el análisis de MIMIC, con la que esperaba conseguir una porción mayor de la clave y el texto claro, pero que al final no conseguí desarrollar. Como la idea la tengo en el aire, al desarrollarla aquí para su publicación quizá no la haya explicado de la manera más óptima.

En el paso anterior obtuvimos los candidatos a texto claro-clave, pero sólo hasta la repetición del primer carácter del texto claro. Esto nos permitió obtener también los primeros caracteres del primer alfabeto desordenado. Supongamos que tenemos los siguientes caracteres del texto claro, hasta que se repita la siguiente letra, porque a partir de esa repetición, se cambia de nuevo el alfabeto desordenado. Si hacemos XOR de esos caracteres, obtenemos los correspondientes caracteres del segundo alfabeto desordenado. Si tuviéramos todos los caracteres del primer alfabeto desordenado, podríamos determinar con seguridad los caracteres correspondientes de la clave. Pero como no los tenemos, lo más seguro es que no podamos determinarlos, sobre todo porque la determinación de un carácter depende de la determinación del carácter anterior, ya que el nuevo carácter se determina por un desplazamiento a partir de la letra anterior, y si no conocemos la letra anterior, no podemos conocer su posición y, por tanto, no podemos calcular su desplazamiento.

Tomemos la primera letra que hemos calculado del segundo alfabeto desordenado. Su posición en el segundo alfabeto desordenado coincidirá con la posición de la letra, ya que todavía no hemos podido cifrar un bloque de texto de longitud la del alfabeto. Para determinar la correspondiente letra de la clave, es necesario que este carácter de este segundo alfabeto desordenado esté presente en el primer alfabeto desordenado. Si tenemos suerte, podremos determinar esta letra de la clave. Si no, no podremos determinarla, ni las siguientes. Y así se seguiría, hasta encontrar una letra del segundo alfabeto desordenado no presente en el primero, o hasta terminar con todas las letras. Se comprobaría si el fragmento de clave obtenido es un fragmento de texto válido, y se seguirían los pasos explicados en los pasos anteriores. Si resulta que hemos podido determinar todos los caracteres de la clave en este segundo fragmento de texto claro, repetimos el proceso con el tercer fragmento. Hay que tener en cuenta que en este paso ya se ha añadido a la clave un carácter aleatorio (que calculamos como se explicó en pasos anteriores), que habrá que tener en cuenta a la hora de comprobar el fragmento de clave obtenido. Si encontramos este carácter, es posible que hayamos determinado la clave completa. Lo comprobamos descifrando el criptograma con la clave obtenida, sin el carácter aleatorio.

En caso de que hayamos encontrado un carácter del segundo alfabeto desordenado no presente en el primero, podemos hacer una operación que quizá nos permita descartar algunos candidatos. Esta operación consiste en calcular un fragmento del segundo alfabeto desordenado a partir del fragmento que tenemos del primero. Para ello, basta calcular de forma normal el segundo alfabeto desordenado, a partir de lo que tenemos del primer alfabeto desordenado, pero sólo hasta completar los caracteres de la clave que tenemos. Al aplicar este método, obtendremos la posición de una letra en el primer alfabeto que deberemos colocar en el segundo alfabeto. Estas letras se colocarán en las primeras posiciones del segundo alfabeto, hasta llegar a las letras que ya tenemos del segundo alfabeto, por lo que no hay posibilidad de sobreescribirlas. Nos podemos encontrar con las siguientes posibilidades:

- Tomamos una letra de las que tenemos en el primer alfabeto, y esa letra no existe en el segundo alfabeto: en este caso, añadimos esta letra en el segundo alfabeto, tal y como se hace en el cálculo del alfabeto desordenado
- Tomamos una letra de las que tenemos en el primer alfabeto, y esa letra ya existe en el segundo alfabeto: en este caso, estamos ante un alfabeto con letras repetidas, lo cual es incorrecto y, por tanto, el fragmento de texto con el que estamos trabajando es incorrecto. El error puede estar tanto en la última parte añadida, como en el candidato con el que estamos trabajando. Supondremos que es esta última parte añadida la errónea, así que la eliminamos, y buscamos otra parte a añadir
- Tomamos una letra del primer alfabeto que desconocemos: dejamos la letra en el segundo alfabeto vacía y continuamos con el proceso

Creo que esto se puede desarrollar aún más. Por ejemplo, si añadimos a la clave un fragmento posible, obtenemos más letras del primer alfabeto desordenado. Si alguna de estas letras se encuentra entre las letras que hemos encontrado del segundo alfabeto desordenado, podemos repetir el cálculo de este segundo alfabeto desordenado, como se indicó antes, a ver si hay errores. Si los hay, habría que ver dónde está el error, si en la clave, en el texto, o en ambos. Si no los hay, podemos seguir avanzando. Podemos repetir esto para obtener nuevos fragmentos de texto y clave, aunque cada vez es más incierto que lo que estamos obteniendo sea correcto. Con estos nuevos fragmentos, obtenemos diferentes fragmentos de alfabetos desordenados consecutivos (haciendo XOR con el texto claro que estamos probando y la clave. Cada repetición de letra determina el final de un alfabeto desordenado y el comienzo del siguiente) y probamos claves, a ver si no se producen errores, o si tenemos suerte de encontrar la clave. Quizá haya más cosas que se puedan hacer.

Hasta aquí lo que se me había ocurrido. Como ya he dicho, todo esto no lo llegué a desarrollar, así que no sé si es efectivo o no.

opinar

Texto puro

  • No se permiten etiquetas HTML.
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Saltos automáticos de líneas y de párrafos.
By submitting this form, you accept the Mollom privacy policy.