Foros:
Por sqrmatrix
¡Resuelto! Enhorabuena a Agustín, LlamameX y el equipo criptoanalítico habitual
Hola a todos. Lo primero de todo, pedir disculpas por la ausencia tan larga. En mi defensa diré que no fue intencionada, sino consecuencia de ciertas circunstancias personales. En este tiempo no he podido dedicarme a ningún reto.
Bueno, y ahora que ya está aclarado todo, deciros que me he cambiado de bando, y ahora, en lugar de ponerme a atacar algún reto, voy a proponer uno. Como nunca he propuesto retos, no sé si éste estará a la altura. Ya veremos. Antes de plantearlo eché un vistazo por encima a los retos propuestos anteriormente, para no repetirlo, y no me pareció ver ninguno similar a éste, aunque no los miré a fondo (eran muchos). Espero que no se repita.
He ideado un cifrario que se puede definir como un XOR con doble clave. El cifrario es bastante simple.
Siendo este cifrario un XOR, necesita un alfabeto cuyo número de letras sea una potencia de 2. Utilizaremos el alfabeto de 32 letras "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,:;".
Este cifrario dispone de dos claves. Una la llamaremos clave par, y la otra clave impar. Por cada letra que avancemos en el cifrado, elegiremos una de las claves. Si estamos situados en la letra i-ésima, consultaremos la letra (i-1)-ésima del mensaje original en claro. Si esta letra ocupa una posición par en el alfabeto, elegiremos la clave par, y si ocupa una posición impar en el alfabeto, elegiremos la clave impar. Cuando estemos en la primera letra del mensaje, como no tenemos letra (0-1)-ésima, tomaremos en este caso la clave par.
Para el cifrado, crearemos una copia del mensaje sobre la que trabajaremos. Es decir, inicialmente el criptograma será el mensaje claro.
Empezamos en la primera letra. Como estamos en la primera letra, tomamos la clave par. Enfrentamos las letras de la clave con las letras del criptograma, a partir de la primera letra, y hacemos XOR de las letras de la clave con las del criptograma, dejando el resultado en el criptograma.
Avanzamos a la posición 1 del criptograma. Consultamos la letra de la posición 0 del mensaje claro. Si ocupa una posición par en el alfabeto, tomamos la clave par, y si es impar, la clave impar. Colocamos las letras de la clave elegida encima de las correspondientes letras del criptograma, a partir de la posición 1, y repetimos la operación XOR como se hizo antes.
Pasamos a la siguiente posición y repetimos el proceso. Cuando nos acerquemos al final del criptograma, a la hora de colocar las letras de la clave sobre el criptograma, habrá letras que sobrepasen el final del criptograma. Estas letras se descartan.
Para descifrar, el procedimiento es el mismo. Cuando estemos sobre la primera letra, aplicamos la clave par. Al realizar la operación XOR, obtenemos la primera letra del mensaje, con la cual podemos determinar qué clave se eligió para la segunda letra, y así sucesivamente.
Para verlo mejor, se pondrá un ejemplo:
Mensaje: EN_UN_LUGAR_DE_LA_MANCHA
Clave par: SANCHO
Clave impar: QUIJOTE
Empezamos por la primera letra del criptograma. Elegimos la clave par, "SANCHO", y hacemos XOR de las letras de la clave enfrentadas a las letras del criptograma:
SANCHO EN_UN_LUGAR_DE_LA_MANCHA ----------------------------------- WNVWKTLUGAR_DE_LA_MANCHA
Pasamos a la segunda letra del criptograma. Ahora debemos consultar la primera letra del mensaje claro para ver qué posición ocupa en el alfabeto y así elegir la clave. La letra es la "E", y en el alfabeto ocupa la posición 4 (empezamos a contar desde 0), que es par, luego elegimos la clave par, "SANCHO", otra vez:
SANCHO WNVWKTLUGAR_DE_LA_MANCHA ----------------------------------- W:VZISEUGAR_DE_LA_MANCHA
Estamos en la tercera letra del criptograma. Consultamos la segunda letra del mensaje claro, que es la "N", y vemos que ocupa la posición 13, que es impar, luego elegimos la clave impar, "QUIJOTE":
QUIJOTE W:VZISEUGAR_DE_LA_MANCHA ----------------------------------- W:HOAZLBCAR_DE_LA_MANCHA
Seguimos aplicando este procedimiento. Al final, resultará que la clave sobrepasará el final del criptograma. Tenemos el caso:
QUIJOTE W:H:EVÑL.X;SCX_SAMZATUMA ----------------------------------- W:H:EVÑL.X;SCX_SAMLU..DT
Que, como se ve, se descarta la letra que sobra. En el siguiente caso se hace lo mismo:
SANCHO W:H:EVÑL.X;SCX_SAMLU..DT ----------------------------------- W:H:EVÑL.X;SCX_SAMLG.QBS
Es decir, se descartan las letras de la clave que sobrepasen el final del criptograma:
SANCHO W:H:EVÑL.X;SCX_SAMLG.QBS ----------------------------------- W:H:EVÑL.X;SCX_SAMLGOQMQ
Queda al final el criptograma:
W:H:EVÑL.X;SCX_SAMLGOAKI
Para descifrar, los pasos son casi idénticos. Empezamos por la primera letra y, como sabemos, se aplica la clave par:
SANCHO W:H:EVÑL.X;SCX_SAMLGOAKI ----------------------------------- E:K.DYÑL.X;SCX_SAMLGOAKI
En esta operación hemos obtenido la primera letra del mensaje, que nos permitirá decidir qué clave hay que elegir a continuación. En este caso, como antes, es la letra "E", que ocupa la posición 4 y, por tanto, debemos coger de nuevo la clave par "SANCHO":
SANCHO E:K.DYÑL.X;SCX_SAMLGOAKI ----------------------------------- ENKQB:BL.X;SCX_SAMLGOAKI
Hemos obtenido la segunda letra, que es la "N", y que ocupa la posición 13 y, por tanto, tenemos que elegir la clave impar "QUIJOTE":
QUIJOTE ENKQB:BL.X;SCX_SAMLGOAKI ----------------------------------- EN_EJWÑ;XX;SCX_SAMLGOAKI
Seguimos así. Los últimos pasos quedan:
QUIJOTE EN_UN_LUGAR_DE_LA_MANSBY ----------------------------------- EN_UN_LUGAR_DE_LA_MANCTQ
SANCHO EN_UN_LUGAR_DE_LA_MANCTQ ----------------------------------- EN_UN_LUGAR_DE_LA_MANCHQ
QUIJOTE EN_UN_LUGAR_DE_LA_MANCHQ ----------------------------------- EN_UN_LUGAR_DE_LA_MANCHA
Aquí está el enlace del reto: https://sites.google.com/site/sqrmatrix/criptograma.txt?attredirects=0&d=1. Son 79956 caracteres. No sé si será suficiente. Si alguien necesita más, sólo tiene que pedirlo.
No sé si este reto será demasiado fácil o demasiado difícil. Ya veremos según avancen las cosas.
Un saludo a todos.

Mas idas de olla
Por si a alguien le sugieren algo.
A efectos prácticos podemos considerar ambas claves de igual longitud, sólo debemos completar la más corta a "A"s (son neutras para los XOR) por la derecha hasta igualarlas. Llamemos L a esa longitud. Asi, a cada letra más allá de la posición L (pongamos A(i)) se la codificará L veces con K(j) j=1..L siendo K(j)=Kp(j) o Ki(j). Tendremos 2 elevado a L combinaciones para las K(j), cada una de las cuales se resume como un único valor con el que hacer el XOR con la A(i).
Un detalle que me llama la atención es el hecho de que se usa la paridad para determinar la clave. Que un carácter sea par implica que su dígito menos significativo sea 0, por lo que la paridad de la K(i) se mantendrá en la C(i) al hacer el XOR.
De momento sólo ideas al aire a ver si a alguien se le va ocurriendo como enlazarlas.
A esto me referia
A esto me refería cuando decía que me hubiera gustado hacer algo más analítico...
Mini reto solucionado
Pues si: mi AG ha encontrado las claves tras unas 5 horas de nada de cocción. La clave impar es EEMK y la par PEMF.
Y el texto era:
(Y no sé de que me suena...)
Para el que le interesen estas cosas, utilicé un AG canónico, empleando una función de coste sencillísima: la cuenta de letras concurrentes en la posición indicada del texto descifrado. El único problema es que la función de descifrado es bastante ineficiente y enlentece mucho el trabajo.
La única sofisticación introducida es la función de cruce: dependiendo de un valor aleatorio cruzo los valores de la clave par, de la la impar o las dos simultáneamente.
Por lo menos ha quedado comprobado que existe una pequeña convergencia entre los valores de la clave y los del texto descifrado, lo que deja claro que se puede encontrar una vía de ataque. A efectos prácticos, dudo de que pueda descifrar el reto principal, puesto que no conozco la longitud de las claves. Pero como con métodos más propios de la nigromancia que de las matemáticas he llegado a la conclusión de que las claves son de unos 10 caracteres, a lo mejor hago una prueba. Eso sí, necesitaré un PC en dedicación exclusiva y contínua un par de días, por lo menos...
Siento no poder hacer más.
Increíble...
...pero cierto. Las claves que utilicé no eran esas, sino GATO y RATA (quería usar RATON, pero tenía más de 4 letras). Es sorprendente que se haya obtenido casi todo el texto (empezaba por POR en lugar de por G,X, pero el resto es lo mismo, el comentario de tokamak que pedía este subreto) con claves tan distintas. Parece que mi monstruito es más vulnerable de lo que parecía, pues parece que permite obtener el texto con claves que nada tienen que ver con las originales. Bueno, ya tenéis una esperanza para derrotarlo. Aunque no encontréis las claves originales, quizá encontréis unas que os permitan obtener casi todo el texto
¿Pero cómo se te ocurre
¿Pero cómo se te ocurre utilizar palabras sueltas para las claves, hombre?. Pero bueno, así ha quedado claro que no utilicé un ataque por diccionario.
Es notable que el cifrado admita -más o menos- claves muy diferentes para descifrar el mismo criptograma, ya me pasó algo parecido con el cifrado Torner para sorpresa de Llamamex, que lo reventó en un pis-pas. Éste también va a resultar más fácil de lo que parecía (espero). Voy a poner a hervir el cocido, a ver si la olla con el xor <em> a les fines herbes </em> pita para mediados de semana...
Bueno... puse palabras porque
Bueno... puse palabras porque no quería empeorar la cosa, ya que todo el mundo decía que esto era difícil, pues lo puse más fácil. Pero bueno, has descubierto una gran debilidad del cifrario, y un método para atacarlo.
Por curiosidad, ¿cuánto tardó el algoritmo en encontrar la solución?
Sería genial...
Sería genial que compartieras el código fuente de tu programa. Me he quedado bastante satisfecho con la explicación, pero me encantaría ver el código fuente del mismo. Libéralo con una licencia CreativeCommons o GPL para que todos podamos juguetear con él ;) . Yo ya había jugado con este tipo de algormitmos y quizás podría hacer una implementación de lo que tienes hecho en Cython; Tiene la ventaja que es tan fácil de programar como Python, pero se puede compilar y se convierte en C, por lo que nos quitamos el intérprete de python de enmedio y lo ejecutamos en código máquina. Es *muy* eficiente.
Para la ejecución del mismo, aparte de posibles optimizaciones que puedan hacerse en el código para reducir al máximo el tiempo de convergencia del algoritmo, se podría usar una Instancia de Amazon como por ejemplo la High-CPU Extra Large que cuesta solo 0.5€/hora y uno dispone de 7GB de memória y 20EC2 Unidades de computación. Con esto no necesitaríamos "días de tener el PC enmarcha a toda hostia". Siempre me ha apetecido probarlo.
Un saludo, Jan.
Longitudes diferentes
¿Pero cómo se te ocurre usar palabaras sueltas como claves, hombre? por lo menos así ha quedado claro que no utilicé un ataque por diccionario. Lo de que claves diferentes descifren (más o menos) el mismo criptograma, ya me había pasado con el Torner, que reventó LlamameX en un pis-pas. Por cierto: ¿claves diferentes, y de diferente longitud también, podrian descifrar fragmentos del texto? sospecho que sí y en ese caso el cifrario estaría prematuramente sentenciado.
Eso va a tener que ver
con lo que decía de las L operaciones XOR. Es decir, si consideramos K(j) j=1..2**L como L operaciones XOR escogiendo para cada i entre los posibles Kp(i) o Ki(i) i=1..L, podemos encontrar diferentes conjuntos Kp y Ki que nos den los mismos K, con lo que a partir de L nos decodificarán igual que el original, con lo que la convergencia parece bastante clara.
Lo de las longitudes diferentes es también posible. Evidentemente añadiendo "A"s al final podemos usar claves tan largas como queramos sin variar el resultado, pero al cambiar L cambiamos también el número de K(j) j=1..2**L con lo que nos pueden aparecer más o menos valores con los que hacer el XOR con A(i). Si son más no habría problema, simplemente no se usan, pero si son menos podemos tener un problema.
Por otra parte, muy bueno tu AG, ¿tienes por ahí la implementación para echarle un vistazo?
AG
Es que está muy customizado, ya lo había advertido en otra ocasión, con Lapyznos, y no se iba a entender nada: tiene muchas pantallas para interaccionar con el usuario, debug's a tutiplen, acceso a varias base de datos en sql... un caos, vamos, que no tiene sentido subirlo.
Además, en lo que de verdad cuenta del AG no tiene nada de particular, vale cualquier implementación estandard de las que vienen por ahí en las bibliotecas de programación, basta meterle las pequeñas puntualizaciones que hago y os funcionará perfectamente.
Voy a probarlo con claves de longitud 10, a ver, y si no de longitud 8 o 9 por lo que dices al final de tu mensaje.
¿No hay novedades?
Parece que la cosa se ha parado. Ya sabéis que si necesitáis alguna pista la podéis pedir (otras cosa es que os la dé :) )
Tres letras
Yo estoy con el ataque a las tres primeras letras, a partir del lemario y de la conocida restricción de 18 letras para la primera letra del texto y de la clave par. Ya sé que resulta un poco cutre, a la vista de los poderosos ataques genéticos que están en juego.
No digas eso, hombre
No digas eso, hombre. Tu ataque no es nada cutre. Seguro que encuentras algo. Además, tu ataque no es sólo esta búsqueda. Has aportado tablas bastante interesantes (que tu trabajo te habrán llevado). Todavía no han permitido romper el cifrario, pero seguro que ayudan
Amabilidad
Hay que ver lo amable que te has vuelto desde el día en que me quejé.
Es que hay que tener contento
Es que hay que tener contento al personal. Si no, ¿quién se va a cargar al bicho que he creado?. Además, quién sabe las consecuencias de mosquear al personal. Por la forma en que os cargáis a los bichos, a veces me dais miedo... :)
Tabla inspiradora
Os paso una tabla que puede servir de inspiración para un ataque mediante texto conocido.
En la penúltima línea de la imagen se muestra el resultado de la función XOR con los caracteres de la clave que se aplican a cada columna. Sólo puse aquellos valores donde la función XOR se aplica tantas veces como la longitud de la clave (4). Si os fijáis sólo hay 3 valores: ",", "J" y "R", que se van aplicando al texto en claro para encriptarlo.
Entonces, si sabemos que en el mensaje original hay una determinada palabra en cierta posición, como dispondremos del texto en claro y del cifrado, podremos obtener unos valores, seguramente discretos, de claves con los que podremos efectuar pruebas en otras partes del mensaje. Además sabremos qué parte de esos valores discretos pertenecen a la clave par y a la impar.
Imágenes:
Está claro que llevas los
Está claro que llevas los algoritmos genéticos en la sangre. Tienes una columna con las letras ATAG, y en columna, típico de las secuencias genéticas...
Pues tu enfoque parece interesante. Se ve cómo el algoritmo puede que no sea tan complejo como aparenta. A ver si por ahí hay una fisura que podáis atacar.
Otra vez se ha parado la cosa...
Bueno, parece que el bicho está resultando duro de roer. Yo sigo por aquí observando los progresos, pero tampoco quiero forzar la maquinaria de ataque. Id a vuestro ritmo
No está parada
Tengo la máquina perpetrando un ataque a las tres primeras letras, aplicando las restricciones que se han comentado en otros posts. Mañana a lo mejor ya ha terminado, je, je.
No, no está parado, de hecho
No, no está parado, de hecho le estoy dedicando mucho tiempo, pero mis AGs no consiguen morder en blando, a falta de conocimiento de la longitud de clave. Tampoco consigo sacar donde está el texto supuesto. Eso si: estoy seguro de que en el texto aparaece la cadena EL_MUNDO_CIVILIZADO (A nigromante no me gana nadie).
Adelantado
Pues vas adelantado, porque seguro que también sabes la posición de esa cadena de caracteres.
Yo estoy tratando de averiguar las tres primeras letras del texto, junto con las tres primeras de la clave par y, a lo mejor, las dos primeras de la clave impar. Cuando acabe la tarea de máquina lo contaré, si no lo has destripado antes.
Un saludo
De acuerdo. Entonces, estais
De acuerdo. Entonces, estais ahí, acechando a mi criaturita, maquinando y conspirando contra ella, y cuando asome la cabeza...
Bueno, y ya que estoy, confirmo la frase EL_MUNDO_CIVILIZADO, que existe en el texto original. Lo anterior lo escribí para que no pareciera que no estaba pendiente del reto. Vosotros id a vuestro ritmo, como ya dije antes
No consigo nada más, y ya me
No consigo nada más, y ya me duelen los ojos, a ver si Agustín es capaz de dar con dos o tres letras del comienzo del texto, con eso y el resto de las pistas quizá podamos avanzar un poco más. Es un sistema de encriptación realmente bueno, teniendo en cuenta su sencillez, me pregunto si sería eficaz en tiempos de la WW II porque es fácil de implementar con lápiz y papel.
Esta noche lo pongo
Esta noche lo pondré; pero no será algo concluyente, sino una lista (larga) de candidatos entre los que hay que elegir o ir probando.
No es tan bueno
Recuerda que claves diferentes a las utilizadas pueden descifrar el criptograma (de hecho, lo descubriste tú). Además, hay algo que he visto (y que los demás no han visto, o lo han visto pero no lo han dicho) que me hace pensar que no es muy fuerte, aunque sólo es una observación que no he comprobado. Supongo que acabaréis viéndolo los demás también
¿Convergencia?
¿Se produce algún tipo de convergencia con algún tipo de clave?
Pues eso no lo he comprobado
Pues eso no lo he comprobado ni lo he visto, así que no lo sé
Convergencia
Sí existe, aunque débil. Fijate en el siguiente texto, cifrado con claves de longitud 10, como la alteración de uno o dos caracteres en la clave sigue proporcionando fragmentos reconocibles
Impar, par
CIVILIZADO MORTADELOS
EL_NILO_FUE_UN_ELEMENTO_FUNDAMENTAL_PARA_EL_FLORECIMIENTO_DE_LA_CIVI
Impar, par
CIVILIZADO MORTADELOU
EL_NILO_FSC_UN,ELEMELTO_FSNFGKELTAL_PATG,EN,FLJTCEIKIENTO,FC,NG,CÑVI
Impar, par
CIVILIZADX MORTADELOU
EL_NILO_FSCMMS:FC:Q_Y;,F.UÑDCDGTJPR,EXQ_XBZLATJÑFJ.,QKXNSYJNTPSLA_ND
Ataque a las tres primera letras - Historia de un fiasco
Este ataque por fuerza bruta se basa en ciertas restricciones que han sido establecidas gracias a cierto nivel de ingeniería social y a la bondad del autor de engendro, sqrmatrix. Me refiero a la suposición, expuesta en posts anteriores, y no refutada por él, de que ni la primera letra de la clave ni la primera del texto sea ninguno de los caracteres “exóticos” del alfabeto, lo que limitaba las disponibles a 18 letras.
http://www.kriptopolis.com/comment/2221#comment-2221
http://www.kriptopolis.com/comment/2254#comment-2254
A partir de un lemario se han extraído todos los trigramas y todos los digramas iniciales de palabra, y se han usado respectivamente como clave par y como clave impar, calculando para cada combinación posible las tres primeras letras del texto plano correspondiente, obteniendo líneas con el formato:
al aplicar el algoritmo de sqrmatrix:
Se supone que P1 pertenecerá al conjunto de las 18 letras, según la restricción citada. La clave aplicada en el segundo paso será la clave para si P1 es par, y también se aplicará la clave par en el tercer paso si P2 es también par. En suma, en los casos en que P1 y P2 sean pares, la clave impar no se utilizará, por lo que en los resultados vendrá representada por tres asteriscos (“***”) . Esto es un grave inconveniente, porque podríamos llegar a tener los tres caracteres planos P1 P2 y P3 correctos, y las tres letras de la clave par, sin obtener ninguna pista de la clave impar. Recordemos que esta circunstancia se consideraba una grave debilidad del algoritmo.
Por el contrario, si P1 es impar, en el segundo paso se utilizarían los dos primeros caracteres de la clave impar, que se muestran en el resultado. En el caso de que P1 sea par y P2 sea impar, sólo se utilizará el primer carácter de la clave impar, que se mostrará en el resultado seguida de dos asteriscos. En ningún caso se utilizan más de dos caracteres de la clave impar.
La segunda dificultad de este ataque por fuerza bruta, es que hay múltiples combinaciones de claves distintas que devuelven el mismo trigrama en claro. Es curioso, que también aquí aparezca como problema lo que seguramente es una debilidad del algoritmo ¿o acaso no lo es?
El tercer gran problema de este ataque es que el lemario utilizado contenía multitud de palabras exóticas, plabras latinas, americanismos y anglicismos, así como siglas de uso común (DVD, FAX, TNT. etc) Traté de expurgarlo un poco, pero era una tarea muy pesada. Una vez que obtuve los trigramas iniciales se volvía menos pesada, pero al acometer la limpieza de los trigramas vi que había aumentado el riesgo de eliminar algunos que podrían corresponder a palabra válidas, aunque no se me ocurrieran en ese momento. Y consultar para cada caso el lemario era más pesado que la tarea que inicialmente rechacé.
En principio podríamos esperar una explosión combinatoria, pues hay 2299 de trigramas y 224 digramas lo que podría nos daría 51976 combinaciones. Pero al introducir la restricción de que el trigrama plano tenga sentido o, al menos, que pertenezca al conjunto de los trigramas obtenidos del lemario, (sin signos de puntuación), la cantidad se reduce a algo menos de 20000.
En suma, que tenemos un fichero de unos 300 kb con 18647 líneas formadas por el trigrama inicial de la clave par, el digrama inicial de la clave impar, y el trigrama inicial del texto plano. ¿Qué hacer?
Donde la combinatoria oscurece el problema, la lingüística podría aclararlo. Todo ese material se puede volcar sobre una hoja de cálculo, obteniendo tres columnas con los antedichos ítems. Puesto que hay gran número de repeticiones, procederemos a ordenarlos alfabéticamente por la tercera columna, la del texto plano, y empezar a analizar el resultado a la luz de las reglas del idioma.
a) Por ejemplo, todas las filas con trigramas planos bizarros, como “TNT”, “CNI”, etc se borran.
b) Una vez cribados los trigramas de la tercera columna, podemos cribar los de la clave par, usando la presunción de que sqrmatrix no ha puesto claves raras, sino que están formadas por palabras comunes, tal vez formando frases. De manera que procederemos a ordenar alfabéticamente todo el material por la primera columna, e iremos eliminado todas las filas que tengan trigramas bizarros para la clave par. Está claro que este método no valdría si se utilizaran claves aleatorias.
c) Y aún podríamos ordenar por la segunda columna y cribar el digrama de la clave par, al menos para eliminar los más bizarros, como “PS” o “PT”
d) Ahora vendría muy bien tener una estadística de los principios de párrafo o incluso princcipios de texto, en el caso de ensayo, sugerencia de Tokamak que no entendí bien en su momento, pero que ahora se me hace evidente. Desgraciadamente no disponemos de esa estadística. Podemos especular con el tipo de palabra que presumiblemente inicie un texto, que en este caso será más probablemene un ensayo que una novela, por la aparición repetida de la palabra “civilizado”. En esta tarea es más útil la lingüística que las matemáticas -al fin y al cabo, la criptografía es una materia multidisciplinar-, por ejemplo, no creemos probable que el texto empiece con un sustantivo o nombre común, de manera que todas las filas con trigramas que correspondan (de esto hay que estar más o menos seguro) a sustantivos comunes, se borran. Si tengo el trigrama “AYU” es casi seguro que correponde a “AYUNTAMIENTO”, "AYUDA" o “AYUNAS” o cualquier forma de los verbos "AYUDAR" o “AYUNAR” Y es muy raro que un artículo -que seguramente es un ensayo- empiece con una palabra de esa especie. Cuidado: un gerundio sí que podría ser palabra inicial, pero con tres letras no podemos siquiera vislumbrarlo. En resumen, que se pueden borrar todos los trigramas que presumiblemente no formarían parte del inicio del texto del artículo o ensayo cifrado, con los riesgos que estas decisiones puedan conllevar.
Otra cosa sería si el trigrama correspondiera a un nombre propio. En el caso de ”EUR” no lo borraríamos, porque sí parece posible que un ensayo empiece por algo como “EUROPA ES EL RESULTADO DE UNA MEZCLA DE...”. Pero no parece verosímil que el artículo empiece por un nombre de persona, ni por un pronombre, salvo que se trate de una novela o de un cuento. De manera que los resultados como “GUZ” se borrarán, porque no parece probable que el texto empiece por “GUZMAN EL BUENO” o “GUZMAN DE ALFARACHE”, aunque nunca se sabe.
Se prestarán especial atención a los trigramas planos que parezcan sugerir artículos , como “EL_” “LA_”, “LOS”, preposiciones como “DES” (“desde”) o adverbios, aunque quién diablos puede saber con sólo tres letras, si lo que viene es una cosa u otra.
La idea es que después de estas cribas nos quede un conjunto relativamente reducido de filas con claves y texto plano verosímiles. Entonces, yendo a la implementación de que dispongamos, por ejemplo la que nos ofrece krenel00, podríamos probar esos principios de clave, a ver si completándolos aparece algo aceptable como resultado.
O sea, un ataque patatero, por no decir cutre y miserable. Pero no siempre el criptoanálisis es tan brillante como los trabajos a los que sqrmatrix o mellon, entre otros, nos tienen acostumbrados. Cuanto más fuerte es el cifrado más feo se vuelve el análisis. No sé si este cifrado es especialmente fuerte desde un punto de vista objetivo, pero para mis humildes fuerzas sí que lo es.
Me pongo a la faena de desbrozar este patatal; pero por si a alguien le interesa, pongo a vuestra disposición el material, formado por el fichero texto original y varias hojas de cálculo con diferentes niveles de cribado en la carpeta compartida: https://www.dropbox.com/sh/dt4n6gr5osee06a/bMLiQKUpoG (ya me diréis si funciona)
Debo reconocer, ahora que lo he terminado, que el ataque a las tres primeras letras es, seguramente, un fracaso, ya que no sabemos si el texto empieza por el título del ensayo, por la introducción, o por el contenido del propio ensayo, y la sintaxis estilística de cada cosa es distinta. Por otra parte, este cifrado, quizá por la multiplicidad de XOR, tiene algo de camaleónico, apareciendo falsos positivos por todas partes, como pude comprobar en mis propias carnes cuando con claves legibles encontré un texto legible... y falso. Por eso, aun descartando muchas más entradas que siguen siendo bizarras, nos encontraremos con decenas de trigramas de texto verosímiles, asociados a iniciales de claves también aceptables. Habrá que ir a las implementaciones e ir probando. Quizá tres letras sea demasiado poco texto para extraer conclusiones, pero ir a por más está fuera de mis posibilidades de cómputo.
P.S.
Una pregunta para Tokamak: ¿Cómo podías saber con seguridad que está presente la cadena de caracteres "EL_MUNDO_CIVILIZADO"? Y ¿no sabías su posición en el texto? Expica, explica.
Imágenes:
Quizas le encontreis utilidad a mi tabla de trigramas
Esta construida 32x32x32 partiendo de un volumen grande de texto en castellano (no recuerdo cuanto use pero era bastante). El valor para un trigrama representa el número de veces que aparece en el texto, con lo que un 0 (la gran mayoría de los resultados) implica que ese trigrama no aparece y un valor bajo (menos de 10) una probabilidad extremadamente baja. También incluye los espacios en blanco, con lo que "LA_" o "EL_" están presentes.
La función la podeis encontrar en el código de la página de test que le pasé a Tokamak aquí http://llamamex.nixiweb.com/tftr/tritest.html
Es javascript pero fácilmente convertible a otra cosa.
Lamento no poder estar más activo aunque os sigo.
He echado un vistazo a tu
He echado un vistazo a tu tabla de trigramas, y parece bastante interesante. Por lo que veo, entiendo que almacenas la frecuencia de aparición de cada trigrama. A la hora de usarlo, supongo que dispones de varios trigramas candidatos, y vas probando del que más frecuencia tenga al que menos. Supongo que se establece un límite, y los trigramas que tengan una frecuencia inferior a ese límite se descartan. Corrígeme si me equivoco. Creo que es muy interesante.
Por ahí va.
Efectivamente, la construcción es por frecuencias con la idea de ser usada como criterio de validación. La construí para TFTR2 como método de descarte rápido para aprovechar la posibilidad (errónea) de que la clave estuviera construida con texto claro con separadores, pero creo que sería muy aprovechable para atacar los primeros caracteres de tu algoritmo. Ahora cuelgo un post sobre como podría hacerse.
Tendría que hacer dos tablas.
Debería añadir una nueva tabla usando sólo principios de palabra, ya que la tabla contiene trigramas en bruto para cualquier posición. El ataque que estoy diseñando trabajará con 4 carácteres con lo que usaría un trigrama inicial y uno central. La idea es poder suponer 3 caracteres también para la clave impar, cosa que me obliga a ampliar en texto a analizar.
Interesante trabajo
Simplemente voy a decir 3 cosas. La primera, es que la palabra CIVILIZADO no aparece repetidas veces, como indicas, sino sólo una. Lo remarco para evitar confusiones. La segunda, es que una de tus condiciones para cribar candidatos no se cumple para el reto, y creo que has descartado un candidato válido. La tercera, es que en una de las imágenes que has puesto hay aciertos parciales, es decir, que tienes resultados que no son totalmente correctos, ni totalmente incorrectos.
Quedo a la espera
Gracias por la información. No tengo fuerzas para repetir el proceso. Quedo a la espera de lo que hagan LlamameX y los demás.
Aruspiceando
Ya he dicho, y nadie me hace caso, que en esto del criptoanálisis suelo echar mano de mis dotes nigrománticas, y es así como he averiguado lo de la frase "EL_MUNDO_CIVILIZADO". Simplemente revisé algunas entradas de Google donde figuraban "CIVILIZADO" y "CIVILIZACION" y la frase de marras aparecía recurrentemente, asociada a "CIVILIZADO". Además, como ya había apuntado Agustín, los textos más frecuentes eran ensayos históricos y alguna novela, como "Un mundo feliz", de Aldous Huxley.
Como es gratis especular, creo que el texto en claro podría versar sobre los inicios de la agricultura, en el neolítico, o sobre la creación de las primeras ciudades en el Indo o Mesopotamia.
Es que si no, no se que hacer. Mis AGs necesitan saber la posición del texto en claro para proceder: el ataque sería teóricamente factible en un tiempo finito, probando el inicio de la frase en todas las posiciones del criptograma, pero en terminos prácticos es irrealizable con recursos limitados. Mis AGs son como buitres, que precisan que el objetivo esté ya un poco blandito para poder meter el cuello hasta el mondongo.
Seguro que estáis decepcionados.....
Al contrario...
...yo estoy impresionado con tus AG, tanto el que has empleado aquí como los que has empleado en otros retos. Siempre me ha gustado esto de la inteligencia y vida artificiales, y ver una aplicación a la criptografía es algo que me ha encantado y que no me esperaba.
Bueno, y con respecto a tus especulaciones sobre el tema del que trata el texto original, frío frío...
Bueno, os veo un poco rendidos. Si necesitáis pistas, pedidlas
Pistas
Es que creo que ya tenemos unas cuantas. A saber:
1-) Figura la palabra CIVILIZADO
2-) Aparece una vez
3-) Forma parte de la frase EL_MUNDO_CIVILIZADO
4-) Figura la palabra CIVILIZACION
5-) El texto no es un ensayo histórico sobre los orígenes de la civilización
6-) Tampoco, algo es algo, la novela "Un mundo feliz"
7-) Muy importante: el cifrario cuenta con una debilidad que no hemos sido capaces de detectar aún
8-) La autocorrelación, con Cryptool, evidencia una cierta periodicidad en el texto
Por ahora quizá deberíamos conformarnos con esto, al menos unos días...
Respecto al punto 7, hay que
Respecto al punto 7, hay que dejarlo en una posible debilidad, porque no he confirmado que realmente sea una debilidad, aunque tiene toda la pinta de serlo
Yo añadiría
9-) El cifrado no es (muy) caótico. Pequeñas variaciones en la clave no generan grandes variaciones en el cifrado.
10-) Claves diferentes a la del cifrado pueden ser usadas para el descifrado (al menos en parte).
11-) El cifrado está alineado con las claves. Los primeros caracteres en claro se cifran sólo con los primeros caracteres de las claves. El resto de la clave no le afecta.
Y alguna cosilla más pendiente de formalizar que ya añadiré
Ataque al inicio del cifrado
Siguiendo el camino de Agustín y partiendo de la base de que la parte más débil del cifrado es el inicio, se me ocurre un método de ataque que nos permita avanzar en la obtención de las claves.
Una debilidad que le veo y que comentaba antes es que el texto está alineado con las claves. Los primeros caracteres del cifrado son afectados sólo por los primeros caracteres de las claves. Si nos fijamos, inicialmente en el primer trigrama, como proponía Agustín, tenemos qué, para garantizar un mínmo de un trigrama en cada clave necesitamos 4 carácteres cifrados. Tendremos que estudiar pues las siguientes 8 posibles aplicaciones de clave (siendo KPi en carácter i de la clave par y KIi el caracter i de la impar; Ai es el carácter i del texto claro y Ci el del cifrado)
Que asumiendo claves en texto claro implica los siguientes trigramas
Donde Ai=Ci^Ki, Siendo Ki el resultado de una las 8 combinaciones anteriores para la posición i.
Entonces la idea será la siguiente. Prefijamos A0 con uno de los 28 valores posibles (salvando los carácteres por los que no puede empezar una palabra "_", ".", ",", ";"), cosa que nos proporciona KP0 y nos determina si C1 ha sido calculado con KP0 o KI0. Limitamos la tabla de trigramas de inicio a los que empiezan por A0 por una parte y por otra a los que empiezan por KP0. En el caso de que C1 haya sido obtenido con KP0 buscamos en las tablas de trigramas un A1 admisible (que exista un A2 tal que A0-A1-A2 tenga una frecuencia aceptable -podemos crear una tabla intermedia para agilizar esta comprobación- y que genere un KP1 asimismo admisible). Llamando N1<=32 al número de A1 aceptables llevaríamos 28xN1 casos
Si C1 hubiera sido generado con KI0 tendríamos dos incógnitas para obtener: la A1 (o KP1) y KI0. Eso nos generará bastantes más cáculos puesto que nos obligará a probar todos los valores posibles de KI0 (igual que A0). Aunque es un resultado desfavorable tampoco nos ha de generar demasiada carga de momento. Llevaríamos 28x28xN1 casos para la búsqueda de un A1 admisible.
Nótese que en cualquier caso (C1 calculado con KP0 o KI0) obtenemos también KP1.
Ahora, para cada A1 que comprobemos (que nos dira si C2 ha sido obtenido de KP0 o KI0) deberemos buscar un A2 admisible según el mismo criterio. El caso más favorable será también ahora que C2 provenga de KP0 puesto que reducimos opciones. Igual que en el caso anterior, venga C2 de donde venga obtendremos valores para KP2 y tendremos 2 trigramas enteros que deberán cumplirse simultáneamente A0-A1-A2 y KP0-KP1-KP2. En el caso desfavorable tendremos dos posibilidades. Si C1 vino de KP0 no tendremos más remedio que probar los 28 casos para KI0 ya que no tendremos datos sobre su valor. Si provino de KI0 entonces ya estamos probando un valor para él y deberemos buscar un KI1 capaz de formar un trigrama válido KI0-KI1-KI2 en la tabla.
Tanto para tener más datos de la clave par (2 trigramas: KP0-KP1-KP2 y KP1-KP2-KP3) como para poder disponer de un trigrama entero de la impar (KI0-KI1-KI2) en el caso de que C1 provenga de KI0 será interesante extender el análisis como mínimo al cuarto carácter. Seguramente obtendremos muchos candidatos válidos que nos obligarán a extender aún más el análisis, pero de momento podemos ver que tal se comporta el filtro por trigramas.
Esta aproximación es muy parecida a la de Agustín. La principal diferencia introducida es el uso de la frecuencia de los trigramas en el análisis como criterio de filtro.
Periodicidad
Mientras implementais el ataque con trigramas, que va a arrojar mucha combinatoria encima de la mesa, quizá aquí pueda haber algo interesante:
El hexagrama RW:_DF aparece 18 veces en el criptograma, en las posiciones (contando desde 1):
8
24
3552
4607
10771
11967
12000
16034
18466
18527
20950
30765
31764
32400
35712
41715
42437
66171
Son divisibles por 8
8
24
3552
1200
32400
35712
También hay un grupo divisible por 5. ¿Nos indica esto que las claves son de longitudes 8 y 5?
Resultados similares se obtienen con otrs n_gramas, como _WJNQ que concurre en:
11298
19066
19424
24632
24906
40970
77400
¿Qué os parece?
Pues que no puede ser casual
¿No hay n-gramas más largos?
Por ahí va la posible
Por ahí va la posible vulnerabilidad que os decía. Sólo os falta dar un paso más para verla por completo pero, como ya os digo, no he comprobado si es una vulnerabilidad explotable
Ataque por texto probable
Dándole vueltas al tema, los cifrados con XOR son sensibles al ataque con texto probable, puesto que aplicando ese texto contra el cifrado obtenemos el resultado de la función de cifra. Así pues si asumimos que "MUNDO_CIVILIZADO" (longitud 16) aparece en el texto claro en alguna posición podemos xorear posición a posición el cifrado y cuando acertemos en la posición obtener los resultados de las KPi y las KIi que se han aplicado. Además, como sabemos los repartos de PAR/IMPAR que corresponden a ese texto claro podemos saber, para una longitud dada, que componentes de cada clave se han usado en cada carácter.
Imaginemos claves de longitud 10 (cuanto más texto probable en exceso de la longitud de clave tengamos mejor). Si alguna es más corta la completamos por la derecha con "A"s que serán neutras para el XOR.
Asi a la "L" de la posición 10 se le aplicaría primero KP9 por la M (valor 12), luego KI8 por la U (valor 21), etc. Acabaríamos montando un sistema de 6 ecuaciones XOR cuyo resultado lo igualaríamos al resultado del XOR del string "LIZADO" con un substring de 6 posiciones del texto cifrado. Formalmente sería
Se pueden hacer XORs por parejas para simplificar algunas expresiones, por ejemplo:
Creo que de aquí se puede sacar un buen ataque aunque como ya digo hace falta un pedazo interesante de texto probable.
Ecuaciones
Pues es lo que hacía falta, pero hay que formalizar unas cuantas ecuaciones antes de meterlo en un programa de búsqueda secuencial. Texto a buscar hay: se puede construir un sistema de 21 ecuaciones, desde el texto conocido "_EL_MUNDO_CIVILIZADO_", suponiendo espacios antes y después, es bastante razonable. De ahí ya podrían obtenerse muchos caracteres de las claves.
Sin embargo no acabo de entenderlo. ¿No obtendríamos los valores de claves que diesen ese texto, para cada {Ci, Ci+1, Ci+2..}? o sea que podrían existir varios valores de claves que generasen el texto buscado en algunas secciones del texto, sin ser realmente la clave. Para comprobarlo habría que probar cada una de las claves obtenidas descifrando todo el texto, para ver si es la correcta. O me estoy haciendo un lío, no sé...
¡Ánimo!
Esto sí que se va pareciendo a un ataque.
Ay, ay, ay...
...que mi criaturita está empezando a temblar de miedo. Sabe que su fin está cerca. Como sigáis así, os la cargáis en breve
Criterio de localización.
Asumiendo la presencia del texto "_UN_MUNDO_CIVILIZADO", si no me he equivocado en algún paso (posible, ya que las expresiones se parecen todas) he encontrado un criterio para ubicar ese texto en el cifrado. Llamemos C0 a la posición de la "U" a localizar en el cifrado (segundo carácter del string, puesto que el primero "_" lo necesitamos para establecer la paridad) y que en el post anterior denotaba por C(i) o C(i+0) pero así queda más manejable. Con el texto ya más largo tenemos:
Que genera las ecuaciones
O con la nueva simbología
xoreando por parejas tenemos que se simplifican muchos terminos
En este punto recordamos que las Ci serán conocidas con lo que las expresiones del tipo C0^02^C1^08 serán constantes. Para simplificar las expresiones llamo Hi a esas constantes. Escogiendo algunos pares de las nuevas expresiones y haciendo XOR entre ellas obtenemos.
Que volviendo a las no usadas nos da:
Así pues
Con lo cual debemos encontrar un lugar donde se cumpla esa condición, siempre asumiendo que ninguna de las claves tiene más de 10 posiciones. También será lógico suponer que habrán bastantes falsos positivos, al fin y al cabo sólo hay 32 valores posibles para cada Ci por lo que por simple estadística encontraremos muchas combinaciones cuyo xor sea 12, con lo que serán necesarios nuevos refinamientos. También es posible que se me haya colado algún gazapo aunque lo he revisado ya que hay bastantes terminos y los carácteres acaban bailando por la pantalla.
falsos positivos
Es lo qie comentaba, que pueden darse muchos casos en los que simplemente encontremos claves a medida para que cada fragmento cifrado nos proporcione el texto buscado, aunque reducirá el espacio de búsqueda, claro.
Si embargo, la frase que sqrmatrix nos dijo que estaba es: "EL_MUNDO_CIVILIZADO" no "UN_MUNDO_CIVILIZADO"
Y yo extendería con espacios: _EL_MUNDO_CIVILIZADO_
Páginas
opinar