Esta misma noche ha ocurrido un gran acontecimiento en este sitio que, sin embargo, ha podido pasar desapercibido a la comunidad kriptopolera.
Se trata de la caída, a manos de sqrmatrix, de ACYNOS ("Ahora Cryptool Ya No Os Servirá"), un algoritmo de cifrado ideado por Agustín hace más de un año, y que había resistido incólume desde entonces...
ACYNOS fue planteado como reto en la Navidad de 2009 y desde entonces ha venido representando un auténtico quebradero de cabeza para los avezados criptoanalistas de Kriptópolis.
A los pocos días de presentado en sociedad, su autor lo sustituyó por una nueva versión, ACYNOS 2, una especie de versión "light" que fue derrotada por el gran SkAsI.
Agustín relanzó a continuación el reto contra la versión potente de ACYNOS.
Estábamos ya en el verano de 2010 y las espadas seguían en alto, hasta que sqrmatrix anunció una nueva acometida, que terminó esta misma noche con la muerte de la bestia...
Como editor del sitio ya he transmitido mi felicitación a los contendientes, a la vez que les he propuesto que nos narren en primera persona los entresijos de la batalla.
Con independencia de que atiendan o no mi petición, estoy especialmente satisfecho por el magnífico ejemplo que nos han dado, brindándonos durante todo un año el grandioso espectáculo que supone contemplar una lucha intelectual en toda regla, que ha comportado un enorme esfuerzo por parte de todos los participantes en el reto.
Un vuelco
Agustín14 Enero 2011 - 9:48pm
Supongo que te dio un vuelco el corazón -frase hecha- cuando viste que una de las claves era legible, ¿no?
La verdad es que es un trabajo magnífico, del que podemos aprender un montón.
Un saludo
Sí
sqrmatrix14 Enero 2011 - 11:13pm
Sí, la verdad es que fue un poco extraño ver entre tanto barullo una frase con sentido, y más siendo la clave del mensaje, lo que me permitiría leer el texto cifrado. Es como encontrar algo que no te esperas encontrar nunca. La verdad es que no me esperaba obtener la clave ni resolver el criptograma.
Bueno, después de herir a la bestia, voy a ver si la mato. A ver si alguien me ayuda. Intentaré aplicar lo visto en el anterior ataque, y lo aportado por otros en tiempos anteriores, a ver si consigo algo. Ya he pensado en algo, pero no sé si funcionará. Iré informando. Todavía no he empezado los ataques, e iré un poco lento, pero lo intentaré.
Bien
Agustín15 Enero 2011 - 1:04pm
Nos vemos en ACYNOS, todavía
Ataque a ACYNOS: Paso 4
sqrmatrix13 Enero 2011 - 11:51pm
En este cuarto y último paso obtendremos la clave del criptograma. Tenía intención de enviarlo ayer, pero no pude.
En el anterior paso obtuvimos el alfabeto desordenado, probablemente rotado, y el criptograma sin la componente aleatoria. Para obtener la clave, vamos a hacer algo parecido a lo que hicimos en el anterior paso.
Lo primero que haremos será colocar el criptograma sin la componente aleatoria en 32 columnas (la longitud de la clave). Hecho esto, sabemos que las letras de una columna están todas codificadas con la misma letra de la clave, de la forma C=T+K. Si conociéramos la letra del texto original, podríamos averiguar la letra de la clave sin más que hacer K=C-T (utilizando el alfabeto desordenado para las operaciones).
Igual que hicimos en el anterior paso, buscaremos, en cada columna, el carácter más frecuente, que será probablemente el espacio. Este carácter espacio tendrá una codificación, a la que habrá que restarle el carácter espacio "_" para obtener la letra de la clave en la columna correspondiente. Esta operación debe realizarse en el alfabeto desordenado. Como el alfabeto puede estar rotado, la clave que obtengamos puede que no sea la utilizada. Para encontrarla, bastará con rotar el alfabeto una posición y repetir las operaciones con el nuevo alfabeto, hasta obtener la clave. En el criptograma, yo obtuve las siguientes "claves". Sólo una de ellas es la clave del criptograma:
Hallada la clave del criptograma, podemos descriptarlo directamente con ACYNOS.
La búsqueda de la clave se ha hecho observando los resultados, y hemos determinado cuál de ellos es la clave porque es una frase con sentido. Para automatizar el proceso, no se hará de esta manera, sino que se obtendrá la segunda semilla de cada clave, y aquella que coincida con la semilla que nos han dado será la clave.
Magnífico
Agustín12 Enero 2011 - 12:33am
Eso, magnífico.
Otra vez, gracias.
sqrmatrix12 Enero 2011 - 12:35am
Otra vez, gracias.
Ataque a ACYNOS: Parte 3
sqrmatrix11 Enero 2011 - 11:49pm
En este tercer paso vamos a obtener el alfabeto desordenado, que nos permitirá realizar operaciones de suma y resta en el criptograma.
En el paso anterior obtuvimos como longitud de la clave el valor 32. Podemos escribir el criptograma en 32 columnas, como se hace en el cifrario Vigenère, aunque no estamos ante un cifrario Vigenère (bueno, sí, pero no un Vigenère clásico).
Sabemos que cada letra del criptograma es la suma de la letra del texto, más la letra de la clave, más el valor del generador pseudoaleatorio. Por tanto, cada columna en que hemos escrito el criptograma tendrá sumada la misma letra de la clave. También sabemos qué valor del generador pseudoaleatorio se le ha sumado, pues con la segunda semilla podemos generar dichos valores.
Si tomamos dos letras de una misma columna, con el mismo valor pseudoaleatorio sumado, y son iguales, tenemos la seguridad de que la letra del texto original es la misma. Es decir, si tenemos T1+K+R=T2+K+R, con T1 y T2 letras del texto original, K la letra de la clave (la misma para ambas partes por estar en la misma columna) y R el valor del generador pseudoaleatorio (el mismo porque hemos elegido letras con el mismo valor pseudoaleatorio), la igualdad sólo se cumplirá si T1=T2.
Supongamos ahora que tenemos dos letras de la misma columna, en las que sabemos que las letras del texto original son las mismas, pero el valor pseudoaleatorio en la primera es R, y en la segunda es R+1, entonces las letras con las que nos encontramos en el criptograma son diferentes, pero consecutivas en el alfabeto pseudoaleatorio. Esto es, tenemos, a la hora de codificar ambas letras, T+K+R y T+K+(R+1), que debemos codificar utilizando el alfabeto desordenado. Está claro que la primera codificación y la segunda serán codificadas con letras adyacentes del alfabeto desordenado.
Con estas dos ideas podemos obtener el alfabeto desordenado. Para ello, necesitamos obtener, para cada valor del generador pseudoaleatorio, letras codificadas con la misma letra del texto original. Es decir, necesitamos encontrar letras codificadas de la forma T+K, T+K+1, T+K+2, ..., donde 0, 1, 2, ... son los diferentes valores del generador pseudoaleatorio.
Teniendo en cuenta la primera idea, sabemos que las letras de mayor frecuencia para un valor del generador pseudoaleatorio se corresponderán con las de mayor frecuencia del texto original, y éstas serán probablemente los espacios. Para obtener estas letras, basta buscar las letras de mayor frecuencia para el valor 0 del generador pseudoaleatorio, las de mayor frecuencia para el valor 1 del generador, las de mayor frecuencia para el valor 2, ....
Una vez obtenidas, procedemos a obtener el alfabeto. Para ello, suponemos que la letra del alfabeto desordenado asociada al valor 0 del generador pseudoaleatorio es la primera. La anotamos como primera letra del alfabeto pseudoaleatorio. La que tiene asociado el valor pseudoaleatorio 1 será la siguiente, y la anotamos a continuación de la otra, y así sucesivamente. Al terminar, habremos obtenido un alfabeto desordenado, probablemente rotado con respecto al que tiene el criptograma.
Este alfabeto no tiene por qué ser correcto al 100%, y seguramente haya letras repetidas, y letras mal colocadas, pero habrá varias que estén correctamente colocadas, salvo por la rotación.
Esto que hemos hecho en una columna debemos hacerlo en todas. Cuando terminemos, tendremos 32 alfabetos desordenados, uno por cada columna en que hemos escrito el criptograma. No tiene por qué haber ninguno correcto al 100% (de hecho, en el criptograma no encontré ninguno correcto al 100%). La lista de alfabetos que obtuve para el criptograma fue:
Se puede ver que hay subcadenas que coinciden en todos ellos, algunas quizá con algunas letras diferentes, pero fácilmente detectables visualmente. Destaca, sobre todo, la subcadena "EABXUT". Estas subcadenas no están alineadas. El siguiente paso es alinear los alfabetos. Yo los alineé manualmente, pero se podría hacer automáticamente de manera fácil. Para ello, habría que tomar un alfabeto como referencia. Después, se toma el alfabeto que se quiere alinear. Se comprueba cuántas letras coinciden en la misma posición en ambos alfabetos y se anota. Se rota el alfabeto que se quiere alinear una posición, y se vuelve a comprobar el número de letras que coinciden, y se anota, y así sucesivamente hasta obtener todas las rotaciones. La rotación con mayor número de letras coincidentes es la que probablemente esté alineada con el alfabeto de referencia, y es la que se tomará. Se repite esto con todos los alfabetos, alineando así todos. Existe la posibilidad de que el alfabeto que se tomó como referencia tenga pocas letras correctamente colocadas, y que la alineación de los demás no siempre sea correcta. Para evitar este problema, se puede repetir esta operación con otro alfabeto de referencia. Si las alineaciones obtenidas en el primer proceso y las obtenidas en el segundo coinciden, salvo rotación, tendremos mayor seguridad de que la alineación es correcta. Repitiendo esto con todos los alfabetos, al final obtendremos un conjunto de alineaciones que se repite con más frecuencia, y de todas ellas, tomaremos una. En mi caso, la alineación manual que realicé dio como resultado el siguiente:
Ahora se puede ver bastante bien cómo estarán colocadas las letras del alfabeto desordenado. Como no siempre las letras de una columna son todas iguales, lo que se hará será elegir la que aparezca con más frecuencia. Al final, debemos obtener un alfabeto desordenado con todas las letras del alfabeto, y sin ninguna repetición. En este caso, el alfabeto desordenado que se obtuvo fue el siguiente:
EABXUTIMQONC_SLJDPRWFGKHÑZYVEste alfabeto puede estar rotado con respecto al que se utiliza en el criptograma original, pero eso no importa. Con este alfabeto ya podemos realizar operaciones en el criptograma. La que haremos ahora será eliminar la componente pseudoaleatoria del criptograma. Esto se hará de la forma:
En "criptograma2" se almacena el criptograma sin la componente pseudoaleatoria. La función "posiciónLetra(alfabetoDesordenado,criptograma[i])" devuelve la posición que ocupa la letra apuntada por "criptograma[i]" en el alfabeto desordenado. Este procedimiento funciona a pesar de que el alfabeto pueda estar rotado con respecto al utilizado por el criptograma, porque en la resta estamos obteniendo una letra del alfabeto situada unas posiciones antes, y la letra resultante será la misma, independientemente de la rotación del alfabeto, porque partimos de una letra y retrocedemos una cantidad de letras, no estamos obteniendo una posición absoluta.
En este punto, tenemos en "criptograma2" un criptograma Vigenère con alfabeto desordenado, que ya conocemos. Si se aplica el método de Kasiski en este criptograma, se verá que funciona.
Ataque a ACYNOS: Parte 2
sqrmatrix10 Enero 2011 - 11:40pm
En el segundo paso obtuve la longitud de la clave (con la ayuda de una pista de Agustín).
La idea para obtener esta longitud es simple. Sabemos que cada carácter del criptograma es el resultado de la suma de una letra del texto original, una letra de la clave y un valor del generador pseudoaleatorio. Como tenemos la segunda semilla, podemos obtener los valores del generador pseudoaleatorio y saber qué valor de este generador está asociado a cada carácter del criptograma. Podemos, entonces, clasificar cada carácter del criptograma según el valor del generador que tenga asociado. Así, para el valor 0 tendremos un conjunto de caracteres, para el valor 1 otro conjunto, ....
Ahora, cada conjunto tiene en común el valor asociado del generador. Si en uno de estos conjuntos encontramos dos caracteres iguales, es probable que el par de letras de la clave y el texto original serán iguales para ambos caracteres. Por ejemplo, si tenemos dos letras en el grupo asociado al valor 7 del generador, y valen ambas D, tendrán asociado el mismo par de letras, que podría ser, por ejemplo, el par E-L ó L-E (la primera letra sería del texto original, y la segunda de la clave). No sabemos si en el primer carácter tenemos E-L ó L-E, y en el segundo E-L ó L-E (en este momento no podemos saberlo), pero esto no importa, como se verá a continuación.
La idea para obtener la longitud de la clave es la siguiente. Dado un grupo de caracteres asociado a un valor del generador pseudoaleatorio, los pares de letras más frecuentes estarán asociados a las letras más frecuentes del texto y de la clave. La probabilidad de que la distancia entre dos caracteres iguales sea múltiplo de la longitud de la clave será mayor que la de otros múltiplos. Si obtenemos todos los divisores de todas las distancias, aquellas distancias que no tienen que ver con la longitud de la clave serán más o menos aleatorias, y la distribución de la suma de los divisores iguales tenderá a seguir el orden natural de sus valores. Sin embargo, aquellas distancias que tienen que ver con la longitud de la clave serán más frecuentes, y los divisores múltiplos de la distancia de la clave serán más frecuentes y tenderán a aparecer antes que su orden natural.
Esta es la idea básica. Para ponerla en práctica, lo que hay que hacer es clasificar los caracteres del criptograma según el valor que tengan asociado con el generador pseudoaleatorio. Luego, obtener, para cada grupo, todas las distancia entre caracteres iguales. Después, obtener los divisores de estas distancias, y por último, contarlos. Cuando terminemos, ordenamos los divisores encontrados por su frecuencia. Aquellos que aparezcan desordenados (de forma notable) con respecto a los demás, serán candidatos a ser múltiplos o divisores de la longitud de la clave, y uno de ellos será la longitud de la clave. El hecho de que puedan ser divisores de la longitud de la clave es que la longitud de la clave tiene también divisores, que serán contados en el proceso, por lo que se añadirán al resto de divisores que no tienen nada que ver con la longitud de la clave, aumentando su frecuencia. Y el hecho de que sean múltiplos tiene que ver con algo parecido, pues la distancia entre caracteres puede ser mayor que la longitud de la clave, siendo esta distancia múltiplo de la longitud, y contándose.
En el cálculo de las distancias con un carácter, hay que calcular todas las distancias que hay entre ese carácter y los siguientes iguales a él. No hay que conformarse sólo con el siguiente.
Para que se vea mejor, aquí va un pseudocódigo:
Para obtener las distancias entre caracteres iguales de un mismo grupo, primero tenemos que obtener las posiciones que ocupan en el criptograma. Para ello, tenemos un array de tres dimensiones llamado "listaDistancias". La primera dimensión hace referencia al valor asociado al generador pseudoaleatorio. La segunda hace referencia al valor del carácter. La tercera permite almacenar las posiciones que ocupan dichos caracteres en el criptograma. Debe ser dinámica, o tener un valor suficientemente grande, porque no sabemos cuántos caracteres habrá.
La función "siguienteValorPseudoaleatorio" proporciona los valores del generador pseudoaleatorio de ACYNOS. Hay que asegurarse de que se obtienen los valores en las posiciones correctas. Es muy fácil equivocarse y obtener el siguiente, o el anterior, valor asociado a cada letra del criptograma.
Lo que hace este pseudocódigo es almacenar las posiciones de los caracteres iguales de un mismo grupo. Esto nos permitirá obtener las distancias.
Lo siguiente es obtener los divisores de las distancias. Tenemos que crear un array donde almacenar la cuenta de divisores. Este array se llama, en el pseudocódigo, "divisores", y tiene como tamaño el del criptograma, porque no sabemos cuál será el máximo divisor que nos encontraremos. Cada celda del array almacena la cuenta del número de divisores, y el índice será el divisor del que se almacena la cuenta.
La función "númeroDivisores" devuelve el número de divisores del entero indicado, y la función "divisor(distancia,m)" devuelve el divisor m-ésimo del valor "distancia".
Lo que hace este pseudocódigo es calcular las distancias de todos los pares de caracteres de cada bloque que coincidan, obtener sus divisores y contarlos.
Después de esto, se puede mostrar la lista de divisores ordenada por su frecuencia. Basta mostrar hasta el límite máximo obtenido en el paso anterior (147), aunque quizá ayude ver más divisores. En mi caso, obtuve la siguiente lista (si no me he equivocado, debería ser la misma salida para todos):
Entre paréntesis está el número de veces que aparece el divisor. Como se puede ver, destacan los valores 16, 32, 64 y 128, de lo cual se sospecha que la clave tendrá una longitud de éstas. En el anterior paso obtuvimos como límite inferior de la longitud de la clave el valor 12, por lo que aquí descartamos los valores inferiores a 12.
Yo hubiera tomado el valor 16 (cuando hice las pruebas, sólo tuve en cuenta los divisores hasta 127, pero aquí muestro el resultado de tener en cuenta todos los divisores. Por supuesto, no los muestro todos para no alargar demasiado esto), pero Agustín me dio la pista para tomar el valor 32. Si no fuera por esta pista, habría que ir probando hasta encontrar el valor de la longitud de la clave. Quizá podría deducirse por el número de múltiplos de cada uno de los candidatos, aunque esto todavía no lo he probado.
No sé si esto es una excepción, o la norma. Es decir, que no sé si este procedimiento funcionará siempre. Es este caso sí ha funcionado, pero podría ser una casualidad. Quizá tenga que ver con que 32 es una potencia de 2, el divisor más frecuente. Si fuese un valor con menos divisores, o divisores menos frecuentes, quizá no hubiera estado tan claro. No lo he comprobado.
Este procedimiento es muy lento. Una automatización del ataque sería lenta con este procedimiento, pero si funciona, el número de intentos es pequeño y compensaría su utilización, en lugar de buscar a tientas la longitud de la clave.
Algo que se me ocurrió cuando escribía esto es lo siguiente. La frecuencia de aparición de un múltiplo de un entero K es de 1/K. Si tomamos M números al azar, la cantidad de veces que aparecerá K como divisor de los números será, estadísticamente hablando, de M/K. Por tanto, si contamos las veces que K aparece como divisor de estos números, y esta cantidad la multiplicamos por K, nos dará un valor que tiende a ser constante, próximo a M, independientemente del valor de K. Ahora, si ocurre que hay mayor número de múltiplos de un valor K que de otros valores, entonces el producto de las veces que aparece un entero divisible por K, multiplicado por K, será mayor que para otros divisores.
Podemos aplicar esta observación al anterior resultado. Si multiplicamos el divisor por la cantidad de veces que aparece, y ordenamos la lista resultante por este último valor, obtenemos lo siguiente:
Entre corchetes angulares está el producto del divisor por la cantidad de veces que aparece (lo que hay entre paréntesis). Como se ve, el 32 no es el valor que da como resultado el máximo valor, pero está cerca. Si hallamos el máximo común divisor de todos estos enteros (y algunos más que no se muestran), obtenemos como resultado 32, la longitud de la clave. Esto me hace pensar que el procedimiento es válido, pues hay gran discrepancia entre los divisores. Esto podría permitir automatizar el procedimiento de una forma más sencilla que si intentamos hacerlo con la anterior lista.
Muy currado
Agustín11 Enero 2011 - 12:57am
Queda patente que la tarea del criptoanalista es mucho más difícil que la del diseñador de algoritmos, aunque éste corre el riesgo de que el engendro no sea tan robusto como él se imagina, cayendo en el consiguiente ridículo.
Me parece un trabajo muy meritorio, además de original. Yo nunca hubiera caído en la idea de que
Bravo.
Gracias por tus palabras,
sqrmatrix12 Enero 2011 - 12:34am
Gracias por tus palabras, Agustín.
Por cierto, eso de caer en el ridículo que dices, espero que no lo digas por tí, porque tu criptosistema ha aguantado más de un año, y todavía sigue aguantando, y me temo que seguirá durante bastante tiempo. Eso es para sentirse orgulloso. Cierto es que, conociendo la segunda semilla, puede caer. Pero sin ese conocimiento... dudo mucho que caiga.
felicitaciones y sugerencia
alrodjes9 Enero 2011 - 8:25pm
Unirme a las felicitaciones y hacer una petición, a modo de humilde sugerencia, por el atractivo y por el interés -tanto del reto y como de la contienda- ¿no cree admin que esto merecería una entrada propia como la serie Enigma?
Saludos
Taller de criptoanálisis
admin10 Enero 2011 - 12:44pm
Dicho y hecho:
http://www.kriptopolis.org/criptoanalisis
Todos los recursos sobre descifrado centralizados y con entrada propia en el menú desplegable del sitio.
Muy bien
Agustín10 Enero 2011 - 12:46pm
Y gracias por la parte que me toca.
Pues sí
admin9 Enero 2011 - 9:01pm
Sí que lo cree
Ataque a ACYNOS: Paso 1
sqrmatrix9 Enero 2011 - 4:19pm
Bueno, aquí comienzo a explicar los pasos que dí para herir a la bestia. Espero que puedan servir para matarla. Cualquiera que intente este reto debería leer todo lo que se ha hecho atrás, pues puede ayudarle, como a mí me ayudó el trabajo de SkAsI. Los que hayan seguido el desarrollo de ACYNOS verán que lo que se expondrá es muy parecido a lo que hizo SkAsI en su día.
Y dicho esto, aquí va el primer paso:
Lo primero que hice fue intentar obtener la longitud de la clave a partir de la semilla que nos dio Agustín (0.8134203118).
Uno de los pasos fue calcular una aproximación del número de Gödel de la semilla. Para obtener la semilla, según se explica en la documentación de ACYNOS, lo que se hace es calcular el logaritmo (en base 10) del número de Gödel, y luego desplazar la coma a la izquierda hasta obtener un número menor que 1. En todas las operaciones se utilizan 10 decimales. Para obtener el número de Gödel hay que realizar el proceso inverso. Como no sabemos cuántos lugares se ha desplazado la coma, tendremos que buscarlo por prueba y error.
Para ello, y tal como expliqué en su día, calculé 10^8.134203118, 10^81.34203118 y 10^813.4203118. No pude calcular 10^8134.203118 por lo lento que era ya el cálculo. En estos cálculos, lo que buscaba era un valor próximo a un entero, pues el número de Gödel es entero. Debido a la pérdida de precisión por tomar sólo 10 decimales, es prácticamente imposible que ninguno de estos valores calculados sea entero. Los valores de la parte decimal que obtuve fueron:
10^8.134203118 ---> .42746006...
10^81.34203118 ---> .31108650...
10^813.4203118 ---> .04366983...
Como se ve, el último caso está razonablemente próximo a un entero. Si ninguno de estos casos estuviera próximo a un entero, tomaríamos como logaritmo del número de Gödel el valor 8134.203118.
Teniendo este valor, podemos calcular entre qué límites estará la longitud de la clave. Para calcular estos límites, basta calcular el mejor y el peor caso.
Sabemos que el logaritmo del número de Gödel se calcula de la forma K1*log(2)+K2*log(3)+K3*log(5)+..., donde Ki es la posición que la letra i-ésima de la clave ocupa en el alfabeto desordenado (nos han dado la segunda semilla). Como no sabemos los valores de Ki, podemos tomar los casos extremos, a saber, Ki=1 y Ki=28.
Para calcular la máxima longitud de la clave, hacemos Ki=1 y calculamos log(2)+log(3)+log(5)+..., hasta alcanzar el valor 813.4203118, pero sin superarlo, pues estamos calculando el caso en que los valores son más bajos. El número de logaritmos que hayamos sumado será la máxima longitud de la clave. En este caso, tenemos 147 como máxima longitud.
Para calcular la mínima longitud de la clave, hacemos Ki=28 y calculamos 28*log(2)+28*log(3)+28*log(5)+..., hasta alcanzar el valor 813.4203118, superándolo, pues estamos calculando el caso en que los valores son más altos. Como antes, el número de logaritmos que hayamos sumado será la mínima longitud de la clave. En este caso, tenemos 12 como mínima longitud.
Como se ve, estos límites no nos ayudan mucho, aunque en el siguiente paso nos prestarán una pequeña ayuda.
Finesse
Agustín10 Enero 2011 - 3:10am
No sé si eso dará resultado, pero me parece un plantemiento muy elegante por su enfoque matemático. Siempre habrá tiempo para hacer estadísticas y aplicar fuerzas brutas. La idea de acotar la longitud de la clave trasteando con el número Gödel me parece muy buena.
Para aclararlo -y aclararme-, consideras que la clave pudiera ser "AAAAAAA...." o "ZZZZZZZ...", considerando A como la primera letra y Z como la última del alfabeto desordenado -que lógicamente no tienen por que ser ellas-. Y determinas la longitud de la clave en cada caso. Me gusta.
Oye, admin
Agustín9 Enero 2011 - 1:35am
qué currada te ha quedado la presentación del foro, con la simbólica cumbre. A quien no he reconocido es al tipo rubio trajeado. Parece un agente de la CIA que baja de la montaña para "recibirnos", je, je.
Vaya, vaya, Agustín...
admin9 Enero 2011 - 10:45am
Así que no has reconocido al agente Max Molon, con esa sonrisa beatífica que se le pone cuando da la bienvenida a nuevos criptodioses en el Olimpo mindungui de Langley...
Ya decía yo
Agustín9 Enero 2011 - 3:07pm
que me sonaba de algo
Ataque a ACYNOS: Resumen
sqrmatrix8 Enero 2011 - 6:12pm
Aquí empieza la explicación de los pasos que dí para herir a la bestia.
Por cierto, antes de nada, he de decir que en mis anteriores exposiciones en las que se restan letras y otras cosas del criptograma, no son válidas si no se conoce de antemano el alfabeto desordenado. Así que si leen algo así como "restar dos criptogramas con la misma clave, restar la parte pseudoaleatoria del criptograma..." en mis exposiciones, debería añadirse "conociendo el alfabeto desordenado y utilizándolo en las operaciones". El motivo de este error es que malinterpreté el algoritmo, y en estos últimos ataques me he dado cuenta del error. Así, si intentan poner en práctica algunos de los métodos que he expuesto, que sepan que no funcionarán sin el alfabeto desordenado.
Ahora voy a explicar un resumen de los pasos que dí, y luego los iré detallando en diferentes mensajes.
Lo primero que hice fue averiguar la longitud de la clave a partir de la semilla que nos dio Agustín (0.8134203118). Hecho esto obtuve, con la ayuda de este dato, el alfabeto desordenado, y con ayuda de este alfabeto pude eliminar la componente pseudoaleatoria, obteniendo así un cifrario de Vigenere.
En lugar de intentar descifrar el texto de este cifrario, lo que hice fue obtener la clave, porque a partir de ella podía descriptar el texto con mayor comodidad.
Y esto es, en resumen, el proceso que seguí para descifrar el criptograma.
Iré dando los pasos con más detalle en días sucesivos.
Fascinado
Agustín8 Enero 2011 - 6:14pm
Estoy fascinado por lo que cuentas. Así que ¿descubriste la clave a partir de la semilla? ¿O a partir de la semilla y el texto cifrado? Bueno espero impaciente tus explicaciones. Es posible que ACYNOS esté más malherido de lo que imaginaba.
Semilla y texto cifrado
sqrmatrix9 Enero 2011 - 4:16pm
La clave la obtuve con la semilla y el criptograma. Estuve un tiempo intentando encontrar la forma de obtener la clave a partir de la semilla solamente, pero no conseguí nada. Lo más que conseguí fue lo que te expliqué de los números de Gödel, pero es impracticable. Es más rentable intentar lo de las 10^10 semillas que se mencionó tiempo atrás.
Por cierto, creo que el ataque que expongo puede automatizarse completamente, lo que significa que quizá pueda ser viable un ataque de fuerza bruta con alrededor de 10^10 intentos (uno por semilla), ya que este ataque permite obtener el alfabeto desordenado y la clave a partir de la segunda semilla. Todavía habría que refinar algunas cosas para reducir algunos intentos y acelerar algunos pasos, y hay que confirmar que, efectivamente, se puede automatizar. A medida que vaya explicando los pasos, la gente podrá estudiarlo.
Aún no. ACYNOS vive
Agustín8 Enero 2011 - 12:50pm
El mérito de sqrmatrix, comparable al menos al de SkAsI en su día, es grande, pero también sqrmatrix ha lidiado con una versión facilitada de ACYNOS, al disponer de la semilla p-aleatoria inicial.
Es de esperar que el trabajo realizado le permita atacar en breve la versión completa del algorimo. Pero de momento, ACYNOS aún vive.
Agradezco mucho las palabras de encomio de admin y el trabajo de sqrmatrix, que espero nos explique detalladamente, así como la atención que le habéis prestado al reto.
Continúa el combate.