Foros:
Por Agustín
Bueno, pues este Fucked-OTP es hijo ilegítimo de AESito32, que tan poca fortuna tuvo en vuestras manos, especialmente por la implacable pericia de LlamameX, que tardó menos en descerrajarlo que yo en concebirlo. He mantenido casi todos los rasgos de su papá, sobre todo porque así la implementación que ya tenéis funcionará perfectamente, con un leve cambio.
La única diferencia es que, a partir del segundo bloque, la clave se va formando con los propios caracteres del texto plano, para crear una especie de falso OTP. De este modo podríamos averiguar si el flujo de caracteres del propio fichero proporciona una clave razonablemente fuerte, es decir, si un falso OTP se puede comportar como un OTP, cosa que dudo mucho.
Vamos p'allá...
1. El alfabeto
Es el habitual, de 32 caracteres
ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,:;
2. La clave
La clave inicial es de 32 caracteres, que se completa, si es necesario, por el viejo procedimiento
K[L+i] = K[i] + 1
Por ejemplo, la clave
LOS_LAMELIBRANQUIOS
se convierte en
LOS_LAMELIBRANQUIOSMPT.MBNFMJCSB
3. Nuevo Alfabeto
El mismo procedimiento para obtener el alfabeto desordenado que se mantendrá durante todo el cifrado -hay que dar alguna oportunidad a los criptoanalistas- Lo copio de AESito32 tal cual
a) Se obtienen las posiciones de la clave en el alfabeto base, lo que nos dará la lista:
12 16 20 28 12 01 13 05 12 09 02 19 01 14 18 22 09 16 20 13 17 21 29 13 02 14 06 13 10 03 20 02
b) Luego se ordena esta lista para obtener una secuencialización, de forma que podamos tratar con las repeticiones.
Clave ordenada 01 01 02 02 02 03 05 06 09 09 10 12 12 12 13 13 13 13 14 14 16 16 17 18 19 20 20 20 21 22 28 29 Secuencia 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
c)Ahora procedemos a desordenar el alfabeto de la siguiente manera: Tomamos la primera letra, que es, lógicamente, la A. Como el primer valor de la clave es el 12, que aparece por primera vez en la posición 11 (empezando por cero) de la secuencia, la letra A irá a la posición 11 del alfabeto
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 __ __ __ __ __ __ __ __ __ __ __ A_ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __
Hay que marcar de algún modo que la posición 11 ya está ocupada. Yo lo he implementado borrando el valor 11 de la matriz de posiciones de la clave.
A continuación tomamos la B, a la que le corresponde el valor 16 de la clave, cuya primera posición en la secuencia es la 20, luego la B va a la posición 20:
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 __ __ __ __ __ __ __ __ __ __ __ A_ __ __ __ __ __ __ __ __ B_ __ __ __ __ __ __ __ __ __ __ __
y así sucesivamente, hasta que nos queda el alfabeto desordenado de esta forma:
FMKX;,HZJP.AEIGSW_NYBQTÑLCR:UODV
4. Bloques de 32 caracteres, que se desordenan
Empezamos a cifrar un texto como éste
LA_REVOLUCION_PALESTINA_POR_RODOLFO_J._WALSH_EN_ESTE_AGOSTO_DE_EN_QUE_RECRUDECE_LA_AGRESION_DE_ISRAEL_EN _MEDIO_ORIENTE_Y_EN_QUE,_CORRESPONDIENTEMENTE,_SE_MULTIPLICAN_LAS_MENTIRAS_IMPERIALISTAS_PROPAGADAS_POR_LOS _GRANDES_MONOPOLIOS_DE_LA_COMUNICACION,_RESULTA_IMPRESCINDIBLE_LEER_LO_QUE_ESCRIBIERA_ESTE_INSIGNE_Y_RECONO CIDO_PERIODISTA_Y,_MAS_QUE_ESO,_ESTE_CONSECUENTE_COMBATIENTE_REVOLUCIONARIO,_INTEGRANTE_DE_MONTONEROS,_QUE _DESAPARECIERA_EN_MARZO_DE_A_MANOS_DE_LA_DICTADURA_DE_VIDELA._ES_ESTA_LA_VERDADERA_HISTORIA,_DOCUMENTADA_A UN_CON_FUENTES_QUE,_COMO_LA_ONU,_SI_PUEDEN_SER_SOSPECHADAS_DE_PARCIALIDAD,_NO_ES_PRECISAMENTE_EN_FAVOR_D E_LA_RESISTENCIA_PALESTINA,_Y_RELATADA_POR_UN_RODOLFO_WALSH_SOBRE_EL_QUE_HOY_YA_ES_UNIVERSAL_SU_CREDIBILIDA D_Y_HONESTIDAD_INTELECTUAL,_UN_ESCRITOR_ALABADO_MUNDIALMENTE_Y_RECONOCIDO_COMO_UN_CLASICO_DE_LA_LITERATURA _POLITICA_Y_COMO_UN_EXCELSO,_PENETRANTE_E_INSUPERABLE_INVESTIGADOR._EL_PRESENTE_TRABAJO_DE_RODOLFO_WALSH_F UE_PUBLICADO_EN_EL_DIARIO_NOTICIAS,_EN_JUNIO_DE_._PUBLICAMOS_ADEMAS_LA_POLEMICA_POSTERIOR_ENTRE_WALSH_Y_EL_E NTONCES_EMBAJADOR_DEL_ESTADO_DE_ISRAEL_EN_ARGENTINA._EL_CONJUNTO_DE_ESTOS_MATERIALES_ES_REPRODUCIDO_EN_BASE_ A_LOS_CUADERNOS_DE_LA_REVISTA_JOTAPE_QUE_APARECIA_EN_LOS_Y_A_LA_EDICION_REALIZADA_POR_LA_EDITORIAL_ULTIM O_RECURSO,_EN_MAYO_DE_._
a) Tomamos el texto en bloques de 32 caracteres
Bloque LA_REVOLUCION_PALESTINA_POR_RODO
b) Generamos una clave nueva, a partir de la anterior, por el procedimieto ya descrito, de tomar para cada carácter, el que le sigue en el alfabeto base. Aunque esto parece excesivamente trivial, no lo es tanto, porque las posiciones de esas letras van a referirse al alfabeto modificado, y la secuencia ya no será tan simple. Eso también viene de la Omelette.
Nueva clave MPT.MBNFMJCSBÑRVJPTNQU,NCÑGNKDTC
cuyas posiciones en el alfabeto modificado son:
Posiciones de la clave 02 10 23 11 02 21 19 01 02 09 26 16 21 24 27 32 09 10 23 19 22 29 06 19 26 24 15 19 03 31 23 26 Posiciones ordenadas 01 02 02 02 03 06 09 09 10 10 11 15 16 19 19 19 19 21 21 22 23 23 23 24 24 26 26 26 27 29 31 32 Secuencia 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
c) Mediante esta clave se desordena el primer bloque de caracteres, por el procedimiento ya descrito.
Bloque desordenado LLEURACLAERROOT__VNI_SD_OIPOPNOA
d) Se realiza XOR entre cada carácter del bloque desordenado y cada carácter de la clave, usando las posiciones de ambos en el alfabeto modificado
En nuestro caso tenemos los siguientes valores:
Bloque cifrado C_RT:VAL.;XQP.EGCT;V;Y:X;RZSAEAN
Hasta aquí todo es idéntico al algoritmo de AESito32. La novedad viene ahora, porque no seguimos generando la clave por el naïf procedimiento anterior, sino que:
5. Nueva Clave: El bloque desordenado
El bloque desordenado del texto plano se toma como clave para cifrar el siguiente bloque. En nuestro ejemplo, la nueva clave será:
Nueva clave LLEURACLAERROOT__VNI_SD_OIPOPNOA
Así de sencillo.
De este modo vamos obteniendo el siguiente texto cifrado:
C_RT:VAL.;XQP.EGCT;V;Y:X;RZSAEAN ,HHÑTTMBOZATEFFOXZNOFZ_ÑEU,NLXY; E_WDWZBFJRXOOE:ZGBGOETXDJOT;XFÑD EDTZ_ÑOFSXDAXWYTFPKL_IOBNOJYJZJO SOFS;YXFD:TTXL_FIBMSDNBROIVF:ZOR :XFSLYAZX:_OBTKTDZQKY:JC:.EQ.RTZ ZFOCDULTTEFAY_UKNG._WZW;WRJKR,FX VGJRKPWFVÑ;ZT;PHFYD;PS_FMNQTUUAA RGFFQFFUP,K,AÑKXZR,CBXW;_XPQVEOJ
6. Descifrado
El descifrado sigue los mismos pasos para el completado de la clave y el desordenamiento del alfabeto. Al tomar el primer bloque cifrado, se hace el XOR con la clave, y lo que se obtiene es el bloque desordenado, que se tomará como clave para descifrar el siguiente. En suma:
a) Completar la clave, si es necesario
b) Desordenar el alfabeto, por el mismo procedimiento de la fase de cifrado
c) Generar una clave nueva, por el método descrito
d) Leer un bloque de 32 caracteres del cifrado
e) Hacer XOR con la clave. Eso nos proporciona el bloque en claro desordenado
f) Tomar el bloque en claro desordenado como clave para el siguiente bloque
g) Reordenar el bloque mediante la clave vigente, y escrbirlo en el fichero de salida
h) Volver a d)
Como podéis ver, no se trata de nada nuevo, sino de una forma de "self-synchronizing stream cipher" o de "ciphertext autokey" (CTAK). (http://en.wikipedia.org/wiki/Stream_cipher), que presentan diversas vías de atque, a diferencia de los auténticos OTP con clave aleatoria infinita, que tienen Secreto Seguro. Mi esperanza es que al tomar como clave el bloque desordenado se incorpore suficiente entropía como para dificultar los ataques basados en texto probable. Pero dada la voracidad reinante por estas aguas, no las tengo todas conmigo.
Problema
El problema consiste en descifrar este fichero:

Asi a priori
Ese tipo de evolución es el que intente en algún fractal y acaban siendo pasto de los algoritmos genéticos.
Aparte de eso se me ocurre un ataque puesto que el cifrado de una posición siempre es en cadena: C(i)=A(j)^C(i-32), partiendo de que para i<32 C(i-32)=B(K(i)+1). Así pues también nos da igual que el bloque se desordene, podemos atacar por estadística la clave buscando el caracter espacio para cada posición del bloque. Basicamente encolumndamos a 32 y para cada columna probamos los 32 posibles carácteres como K(i) y decodificamos sólo esa columna contando frecuencias del caracter espacio, que podemos buscar directamente puesto que seguimos codificando por el alafbeto base para el XOR. Con ello podemos fijar, columna a columna, el caracter +1 de la clave.
Tengo que comprobarlo pero podría ser más sencillo que Aesito, aunque no sería la primera vez que Agustín me guarda una sorpresa oculta, así que ya no me fio de las primeras impresiones.
Yo pensaba
Yo pensaba que sería más sólido que AESito, porque allí la clave acababa repitiéndose, pero puede que tengas razón. También es verdad que los AG de Tokamak dan sustos terribles, pero la esperanza es lo último que se pierde. De todos modos éste es el último, por una larga temporada.
Ves, ya sabia yo.
No es exactamente como lo había visto en un principio, la nueva clave no es el cifrado, es el claro desordenado. Tiene algo más de enjundia, pero de todos modos creo que con una variación del ataque será efectivo.
Yo vine a esta casa con una
Yo vine a esta casa con una autocifra y miren la que me ha liado, que ya me ha parido y va dejando por ahí más bastardos que los Trastámara...
Por cierto que pensaba que ya no lo iba a necesitar para nada, y el otro día me cargué la implementación de Aesito como base para Rubik2. Si es que aquí hay más clonaciones y cruces incestuosos que en la corte de Calígula. A ver como le encchufo ahora mi AG...
A quién se le ocurre
A quién se le ocurre tirar una implementación, en estos tiempos de crisis. Precisamente he mantenido casi toda la estructura para que no tuviérais que hacer gran cosa.
Las instantáneas de volumen
Las instantáneas de volumen son una cosa maravillosa..he recuperado a Aesito en todo su esplendor. Pero si cifro el segundo bloque con la clave LLEURACLAERROOT__VNI_SD_OIPOPNOA
a mi me sale :
Ñ__ÑRPCTA:XP;AICGDABHVYSLMDBY.,X
¿qué más hay que hacer? así simplemente no me sale...
La traza
La traza de mi implementación es:
donde se comprueba la clave actual (clave_run) en cada paso. La idea es que clave_run desordena el bloque (que se guarda para la formar la clave en el paso siguiente), y cifra el bloque desordenado.
Mi impresión es que no tienes la clave que crees que tienes, en el momento de cifrar, o que la aplicas sin haber desordenado previamente el bloque.
A mi me cifra y descifra bien
Tomando como nueva clave el bloque claro desordenado, no el cifrado, que estaba yo equivocándome ahi.
Otra cosa, si tratas cada bloque como único, recuerda que en el primer bloque a la clave le sumas uno pero en los posteriores no, es decir no es lo mismo empezar por el bloque 2 con la clave del bloque 1 como el bloque 1 desde 0.
El Javascript de LlamameX
El mudialmente famoso Javascript de LlamameX obtiene lo mismo que mi implementación.
De momento javascript
De momento aquí teneis la versión javascript, que quien guarda halla XD
http://llamamex.nixiweb.com/fotp/
Alfabeto derivado
Si encontramos el alfabeto derivado cae como un castillo de naipes, puesto que xoreando entre grupos de 32 obtenemos el texto claro aunque desordenado. Desde ahí no debería ser complejo llegar a la primera clave. Necesitamos pues el valor de los caracteres en el derivado para poder hacer los xor.
Por ahora sólo la A
Lo único por el momento que puedo afirmar con una cierta seguridad es que la A se codifica como Ñ, el resto se difumina bastante con el XOR sigo con ello, a ver si consigo afinar más.
Eres bueno
Realmente eres bueno. Ya sabía yo que iba a resultar menos fuerte de lo que a mí me parecía, Según tu planteamiento, eso reduce el problema de 32! a 31! De momento. (Cagontó, no hay manera de hacer llorar a esta gente.)
Ya me funciona FOTP, estaba
Ya me funciona FOTP, estaba evolucionando la clave en cada bloque y volviendo a generar el alfabeto. Veremos que saco ahora.
Entretanto se me ha ocurrido un nuevo sistema de cifrado. Es una pasada, os lo advierto. Creo que he conseguido alcanzar el Santo Grial. Es el más sencillo de cuantos se hayan presentado, incluso más que CHE. En cuento se resuelvan este y Rubik2 os lo presento...
Se me acumulan las tareas...
Este fin de semana me puse con el descifrado del CHE que dije que iba a poner, pero no me funcionó, creo que por error de programación. Tengo pendiente ponerme con el Rubik2, ahora aparece este FOTP, y Tokamak anuncia otro que es el Santo Grial (que Dios nos pille confesados...). Estamos ante una explosión de ideas (recordemos que yo también tengo una idea para otro reto basado en Teoría de Números, muy facilito (creo), que tengo que materializar todavía), y se me acumula tó. Bueno, tendré que ir poquito a poquito
Miedito me da Tokamak
Si esto ya parecen los barracones de BP (por el estrés mas que nada). Aunque debo ser el único aún no he olvidado a TFTR2 y de hecho tengo ideado un ataque que podría ser efectivo, pero me falta tiempo para implementarlo. Esperaba que Rubik2 me lo diera, pero ya ves, Agustín no da respiro. Y también tengo proyectos en cartera... Railroad está casi listo, pero me esperaré a que se despeje el panorama, que hay que dejar sitio para todos XDD
Y de Tokamak ya sabemos lo que podemos esperar... mama miedo.
Yo espero ¿eh? Total, cuando
Yo espero ¿eh? Total, cuando lo publique van a venir unos señores de negro que cerrarán la página y perseguirán con saña a sus habituales por montes, desiertos y veredas hasta acabar con el último...
Sí, es el Algoritmo del Santísimo Copón, aquel que se comporta exáctamente igual que una OTP y sólo puede ser vencido por la fuerza bruta del maligno. (O eso me dijeron en la tienda)
Candidatos razonables
Afinando lo que puedo por Montecarlo (con 100.000.000 de iteraciones) llego a la siguiente distribución de alfabeto. Creo que el espacio (importante) y ":" los tengo muy bien ubicados. Los demás pueden saltar una posición o 2 arriba o abajo, ya que tenemos relativamente poco texto. Ahora tengo que montar una comprobación para acabar de colocarlos en su sitio.
Desgraciadamente...
... tengo la máquina averiada y no puedo confirmar ni desmentir tu hipótesis.
Por lo que respecta a la sobrecarga de retos, me disculpo y os garantizo un largo período de vida contemplativa, sobre todo por falta de ideas
¿Qué te qué?
¿Cómo que te disculpas?, si me proporcionas largos ratos de entretenimiento y, con suerte, la satisfacción de lograr superar desafíos de un buen nivel intelectual. Si en algún caso ha parecido que nos quejamos de sobrecarga es para que el mérito parezca mayor XD. Lo que hemos de hacer y hago es darte las gracias por el esfuerzo que implica idear y preparar un reto, difícil pero no inasequible, que quien no se ha puesto a ello no sabe lo que es. No cuesta nada coger una idea ya hecha, con algoritmos comerciales y reformularla como reto imposible, Tener una idea original, elegante y efectiva y crear con ella un algoritmo nuevo eso es lo difícil.
Ahora, que si quieres abandonar el lado oscuro y atacar a las tinieblas como abanderado de la luz, tampoco te va a faltar trabajo por lo que se ve.
Respecto a las confirmaciones. No pido que confirmes o desmientas la hipótesis (de hecho te pido que no lo hagas), la pongo como avance en el ataque para inspirar a las huestes asaltantes. De hecho sería una casualidad muy gorda que estuviera 100% perfecta, cuento con que bailen la mitad de las posiciones pero sólo uno o dos puestos como mucho.
Me uno a las palabras de
Me uno a las palabras de LlamameX. Lo interesante es tener varios retos a la vez. Mencioné lo de que estaba ocupado con tanto reto para que supiérais que estaba en ello, pero me encanta que haya varios retos. Mencioné lo de la explosión de ideas, pero pretendía dar la idea de que es algo bueno e interesante para este sitio. Cuando tenemos varios retos, si no avanzas con uno, puedes avanzar con otro. Yo ando liadillo con mis cosas y tengo poco tiempo para los retos, pero me encanta cuando hay varios a la vez, porque cuando me atasco en uno me puedo poner con otro, o las ideas de uno pueden ayudar en otro, etc. No sé si a los demás les gusta que haya varios, o prefieren que vengan de uno en uno.
Bueno, si tienes más ideas para retos, siempre serán bienvenidas.
Tener una idea original,
Tener una idea original, elegante y efectiva y crear con ella un algoritmo nuevo eso es lo difícil.
Ése es el espíritu. Lo que no sé es como llegan las ideas. Yo estaba tan tranquilo, implementando FOTP cuando me azotó el rayo y ya no pude seguir con eso, tuve que cojer papel y lápiz y desarrollar la idea de El Grial. (La perdición de Kriptópolis y de nuestras almas...)
Pero sigamos con este FOPT...
Te lo dictarían las voces
Como es en mi caso XD
Ataque efectivo con alfabeto conocido
En otra rama del ataque estoy ultimando la búsqueda de la clave desde el alfabeto y es efectivo y no precisa demasiado texto (si hace falta mucho para el alfabeto). Fijando un alfabeto conocido, en el caso de clave "LOS_LAMELIBRANQUIOS" contra un texto de 3200 carácteres obtengo
Ahora a ver si junto ambas líneas y ultimo resultados.
Buena pinta
Tiene muy buena pinta. Esperemos.
Viendo todo esto, me parece
Viendo todo esto, me parece que sería más inteligente centrar el ataque de los AGs en ataques parciales como este, en vez de un asalto a la clave desde el cifrado...
A ver si se me ocurre como
Aligual si
Ya que tengo que seguir ajustando mi buscador de alfabetos. la verdad es que hay que afinar muchísimo por que las diferencias entre las frecuencias son muy muy bajas. Quizás avancemos más buscándolo por AGs.
Pero qué buscamos ¿la clave a
Pero qué buscamos ¿la clave a aprtir de un alfabeto conocido?
Eso lo tengo bastante listo
Donde más problemas tengo es en el propio alfabeto. Sobre las simulaciones los resultados cuadran siempre bastante, pero cuando intento aplicarlo sobre un cifrado se me va mucho. Seguramente alguna cosa tengo mal, ya que no es lógica tanta diferencia.
La cosa sería buscar el alfabeto con un AG, pero me temo que va a costar de definir. Lo asequible sería lo mismo que ya tengo por que se ve que fácilmente se le puede hacer converger, ya que los criterios son claros.
El alfabeto
He tratado de desordenar a mano el alfabeto y apenas hay coincidencias con el que propones más arriba. A ver con los AGs.
Si, ya se
Alguna cosa falla pero creo que no en la teoría si no en la implementación. A ver si doy con ello.
Nuevas decepciones y resultados
Bueno, he arreglado la simulación y lo que sale, aunque me cuadra más con la realidad es bastante inútil. Por ahí poco.
Sin embargo estoy estudiando un nuevo camino que aunque va a requerir bastante trabajo podría ser prometedor. De momento estoy bastante convencido de que en la sustitución los siguientes resultados se cumplen aunque las letras con las que se hace el XOR con "_" pueden estar bailadas una posición arriba o abajo
EDITO: Esto está mal expresado. Pongo un post más largo donde espero que quede claro.
Posible ataque
Tengo un ataque pero va a precisar muuucho más texto. La idea es la siguiente:
Vamos a obviar la transposición. Nos da igual puesto que no altera las frecuencias de los caracteres. Imaginemos pues que nuestro texto en claro es el desordenado y vamos a atacar la clave, que se mantiene ordenada. Así, nuestra función de cifrado será:
Donde f(x) es la función de sustitución y f'(x) su inversa. Para valores 0>i>=-32, A[i]=K[i+32].
Sabemos, ya que es lo único que nos mantiene el XOR, que el caracter en claro "A" (valor 0) se cifra como "Ñ". Esto es así puesto que hagamos la sustitución que hagamos, si A[i]=A[i-32], entonces f(A[i])=f(A[i-32]) con lo que f(A[i])^f(A[i-32])=0. Dado que ese será el caso de pareja más frecuente ya que incluirá, entre otros, "_" ^ "_". Así pues sabemos que el caracter más frecuente "Ñ" es la imagen de "A". Expresando respecto al alfabeto base f'(0)=19 y f(19)=0.
Dado que de momento no sabemos nada más de f(x) vamos a investigar casuísticas del cifrado. Dado que la aparición de la Ñ nos indica A[i]=A[i-32] y el caso más frecuente de eso es cuando A[i]=27 (espacio), pero no el único, vamos a garantizarlo más buscando en columna dos "Ñ", con lo que A[i]=A[i-32]=A[i-64]. Se dan algunos casos y vamos a suponer que todos son espacios (obviamente estamos aceptando algún error pero esperamos que no sea relevante estadísticamente). Si los carácteres inmediatamente en columna (A[i+32] o A[i-96]) respecto a estos no son "Ñ" eso implicará que son distintos de "_" y, por frecuencia, podemos determinar que carácteres pueden ser. El siguiente más probable tras el espacio es la "A" y en nuestro caso la aparición más frecuente antes o después de dos "Ñ" es el punto ".". Si estamos en lo cierto podremos afirmar que
f'(f("_")^f("A"))="." es decir f'(f(27)^f(0))=28 o f(28)=f(27)^f(0)Aún estamos lejos de obtener el alfabeto derivado pero nos vamos acercando. Si llegamos a tener suficiente texto (hace falta mucho, puesto que operamos en parejas, es decir necesitamos 16 veces más que para atacar una sustitución normal) podremos llegar a establecer el valor de todas las f(x) en función de sus XORs. Si las tenemos todas y sabiendo que f(19)=0 podemos buscar las columnas en claro "_" "_" "Ñ" y sabremos que el siguiente en columna en el cifrado estará en claro, puesto que si f(A[i-32])=0 entonces f'(f(A[i])^f(A[i-32])) = f'(f(A[i])) = A[i], Entonces para C[i+32] podremos obtener de la tabla que hemos creado f(A[i+32]).
Lo mismo que podemos hacer hacia arriba lo podemos hacer hacia abajo puesto que el comportamiento será el mismo con los carácteres anteriores en columna. Entonces, a partir de A[0]..A[32] podremos obtener K[0]..K[32].
Probando el concepto contra un texto de unos 400.000 caracteres cifrado con la clave LOS_LAMELIBRANQUIOS, obtenemos rápidamente que el carácter mas usado es la "F" con lo que f'(0)="F"=5 y f(5)=0. Buscamos pues "FF" en columna y nos fijamos en que caracteres hay justo encima o debajo, obteniendo la siguiente tabla (excluimos la propia F):
Que si comprobamos contra una distribución regenta vemos que cuadra bastante. Según la distribución asignaríamos:
Lo verificamos contra el alfabeto derivado real.
Vemos que acertamos con la "F". Comprobamos las parejas de XOR
Vemos que nos bailan los 2 primeros, pero en general el método parece funcionar.
Bravo
Veo que mantienes el nivel de rigor formal al que nos tienes acostumbrados.
Para proporcionar más texto cifrado hay que esperar a que los del taller me devuelvan la máquina.
Ya tengo máquina
Trato de adentrarme en tus siempre sutiles razonamientos, y me topo con algunas dudas, así que me disculpo de antemano si lo he comprendido mal.
Con respecto a la estadística comparada con La Regenta, no creo que puedan extraerse conclusiones, dadas las características del cifrado. Por ejemplo, obtienes la letra F como la más abundante, pero eso no la empareja, a mi entender, con el separador "_" que es el signo más abundante en el texto de referencia, ya que la F puede obtenerse de diferentes operaciones XOR, como son:
De manera que los picos -o los valles- de las frecuencias del histograma no tienen por qué ser significativos, a diferencia de lo que ocurriría en un cifrado por sustitución. En cada bloque hay una clave diferente, que es el bloque plano anterior desordenado (BPAD), lo que crea una desordenación diferente para cada unos de los bloques siguientes. Es evidente que los BPAD guardarán alguna relación con la estadística de las letras del idioma, aunque no será muy evidente, dado que los bloques son demasiado cortos para que las frecuencias sean significativas. En suma, que si yo fuera un atacante, no sabría por dónde empezar.
Sin embargo veo que has descubierto que primera letra del alfabeto desordenado es la Ñ, y eso me maravilla, así que imagino que tus elucubraciones con las f y f' de los XOR tienen algún sentido que se me escapa.
No me debo de haber explicado bien
No emparejo la F con el espacio, la emparejo con la A en mi ejemplo, puesto que es la que tiene codigo 0 que será lo mas abundante al ser el XOR de 2 variables aleatorias discretas no uniformes.
Luego lo que quiero ubicar son las apariciones de espacios en blanco seguidos en una columna. Me da igual que el carácter esté o no en su sitio, ya digo que obvio la transposición, lo que me importa es que la sustitución siempre es la misma puesto que el alfabeto derivado no cambia y por tanto la frecuencia es relevante, no por bloque de 32, si no por columnas que estarán relacionadas por hacerse el XOR en cadena. Al escoger como clave el texto claro desordenado con el que se acaba de hacer XOR, lo que estamos haciendo es usarlo también en el siguiente bloque del mismo modo, es decir cada trozo de texto claro (desordenado pero con el mismo desorden) lo usas 2 veces y esa es la debilidad que ataco.
Ah
Te habías explicado bien. Soy yo, que no había pillado lo de las columnas.
Divergencias cortas
Bueno, probando el concepto entero, contra una cantidad enorme de texto (El Quijote completo con más de 2M de caracteres) cifrado con la clave "LOS_MOLUSCOS_CABEZONES" Obtengo los siguientes resultados. En la columna 1 aparecen las asignaciones que haríamos al XOR usando las frecuencias de aparición, mientras que en la 2 aparecen las reales. En la columna 3 pongo la distancia en valor absoluto entre ambos valores.
Vemos que hay divergencia pero que no es muy grande, máximo 6 posiciones. No se si será suficientemente corta para permitir un ataque viable. para verlo necesitaría poder acotar los carácteres usados (buscar secuencias en columnas que usen sólo unos pocos carácteres). Afortunadamente en los más usados es donde las distancias son más cortas. Quizas pueda hacer grupos solapados cogiendo 16 para asegurar 10 e ir incrementando. Tengo que pensarlo.
También estoy constatando que quizás no sea necesario filtrar mucho para conseguir resultados equivalentes. En porcentaje las apariciones de cada carácter son prácticamente las mismas que cogiendo directamente la distribución de todo el texto.
¿?
¿De dóne sacará estas ideas? Debe tener un libro, o algo.
Será el Necronomicón por lo
Será el Necronomicón por lo menos, pero ya vendrá El Grial a disipar las tinieblas y los sortilegios del Maligno, ya.
Pues os cuento el siguiente paso
Que también es chulo, ya sabeis, cosas de los atascos de tráfico.
Si consigo completar esa tabla con valores (lo suficientemente) correctos podré buscar la secuencia mágica en columna "ÑÑ_" en el cifrado. Con esta secuencia sabemos:
Sabemos que f(C[i])=f(A[i])^f(A[i-32]) que en este caso es f(C[i])=f(A[i])^f(_) pero si Ci=_ entonces f(A[i])=0 => A[i]=Ñ
Pero si f(A[i])=0 entonces C[i+32]=f'(f(A[i+32]))=A[i+32], así tras ÑÑ_ tendremos un caracter en claro.
Hasta aquí no usamos la tabla. Vamos a meterla ahora. Dado que C[i]=_ entonces f(C[i])^f(A[i]) es un valor conocido de la tabla (es f(_)^f(Ñ)) que equivale a f(_) ya que es f(A[i-32]) y A[i-32]="_". Dado que toda la tabla está en función de f(_) si obtenemos este valor obtenemos todos los f(x) y por tanto el alfabeto derivado.
Edito. Mientras lo releía veo que puedo hacerlo sin la secuencia incluso, ya que no depende de ella: Si f(Ñ)=0 como sabemos entonces f(Ñ)^f(_)=f(_) y todo lo demás es válido. No es preciso usar ÑÑ_ pero me va a servir como criterio de verificación para acabar de ajustar la tabla.
Yo lo dejo
Ha llegado el momento de hacer caso al personal de la clínica, y dejar estos jueguecitos. Realmente, lo que hace LlamameX pertence a otro mundo, en el que yo no habito. El caso es que a mí los atascos de tráfico sólo me producen desesperación.
No sé cómo, pero intuyo que está a punto de resolver el problema.
Ánimo hombre. Yo no entiendo
Ánimo hombre. Yo no entiendo la explicación de LlamameX, pero a la larga algo aprenderemos, seguro.
Gracias
Gracias por reconfortarme. Creía que yo era el único que no me enteraba.
Quizás lo que veis lioso
Es la función de sustitución. Os lo pongo con un ejemplo. Si tenemos el alfabeto derivado
Entonces, usando como notación las letras, tenemos que f(A)=L y f'(L)=A y usando como notación sus índices sobre el alfabeto base la expresión equivalente es f(0)=11 y f'(11)=0. Nótese que siempre que pongo números me refiero al alfabeto base. Lo denoto así aunque lo intuitivo sería decir que f(A)=F por que el orden al cifrar es buscar el índice de la letra en claro en el alfabeto derivado para hacer la sustitución antes del XOR y lo contrario después (buscar la letra del derivado correspondiente al índice del claro) con el resultado del XOR.
Así, si tenemos, por ejemplo, A[i]=E y A[i-32]=L, f(A[i])=f(E)=M=12 y f(A[i-32])=f(L)=X=24, Entonces f(A[i])^f(A[i-32])=12^24=20 Con lo que C[i]=f'(f(A[i])^f(A[i-32]))=f'(20)=f'(T)=B
Respecto a lo de estar a punto de romperlo, antes tengo que llenar correctamente la tabla. Una distancia posible de 6 implica tener que probar hasta unos 11 casos por cada letra (menos en los extremos pero muchos en todo caso) que con 32 carácteres es un número terrible. Es por ello que busco la manera de acortar esta prueba. Si la tabla queda lo suficientemente bien creo que si, que con eso podré obtener el alfabeto derivado y de él la clave. Es decir, tengo un camino que creo correcto pero es largo y aún hay que recorrerlo.
¡Gracias por ayudarnos!
Gracias, LlamameX, por ayudarnos a entender tu ataque mediante este elaborado y pedagógico ejemplo y, también, por no poner el listón muy alto ya que muchos de los lectores de este Sitio, aunque no comenzemos desde cero, hasta no tener bien asidos ciertos conceptos que tú claramente manejas con soltura e incluso maestría, no podremos avanzar gran cosa o a duras penas enterarnos de algo más que del reto propuesto en sí, pero no de las estrategias criptológicas de ataque que tan generosa y talentosamente nos ofreces. Esto último, en mi opinión, tiene más importancia de lo que pudiera parecer puesto que, teniendo en cuenta ciertos principios básicos acerca del aprendizaje [1], lo hacen mucho más asequible o llevadero.
Saludos cordiales,
Pedro Fernández
--
P.S. ¡Agustín, ánimo; que afortunadamente lo importante no es llegar a la meta, sino el viaje mismo! ;-)
Me alegro que resulte interesante
Pero que responsabilidad XD!
Lo cierto es que normalmente intento cambiar mi punto de vista respecto al algoritmo, no verlo como lo ha pensado quien lo ha diseñado, puesto que en esa línea habrá pensado en los ataques y se habrá defendido contra los mismos. Por ejemplo, en FOTP, intentar verlo como bloques desordenados nos llevaría al fracaso, puesto que ahí hay mucha fortaleza. Sin embargo, verlo como 32 columnas independientes entre ellas pero con una relación entre caracteres nos da una vía de ataque. Este cambio de aproximación puede despistar por que parece que se esté hablando de cosas distintas.
También despista que ese cambio de aproximación requerirá un cambio de notación. En la notación hay que ser muy riguroso, puesto que una mala interpretación cuando el nivel de abstracción sube, puede llevar a caminos equivocados que hay que acabar desechando enteros como bien he sufrido.
Luego hay que tener claras las opciones que da un cifrado. Cuando tenemos que enfrentarnos a un alfabeto derivado hay que saber que no podremos operar entre caracteres. No podremos hacer XORs ni operar en módulo con esos caracteres. Sólo podremos contar y tirar de estadísticas. La gracia, entonces, es saber QUE contar. Habrá que buscar una condición, un filtro que nos deje sólo con los caracteres relevantes. Por ejemplo en FOTP determino que la secuencia (en columna) relevante es ÑÑ, puesto que asumo que en la gran mayoría de los casos implicará 3 espacios en blanco encolumnados en el claro (desordenado), por lo que será relevante saber cual es el carácter siguiente (también en columna) a esa cadena.
Hay, por supuesto un trabajo previo antes de llegar a esa conclusión, buscando como el cifrado está condicionado por el texto claro que hay debajo y como podemos usarlo para invertir esa relación, que el cifrado revele el claro, aunque sea parcialmente. En FOTP tenemos un XOR de 2 variables aleatorias discretas no uniformes con la misma distribución, puesto que hacemos el XOR entre letras que salen directamente de desordenar el texto claro, y aunque enmascaramos su valor con una sustitución mantendrán su frecuencia, por lo tanto habrá una serie de cosas que se cumplirán, entre ellas que lo más frecuente será emparejar caracteres iguales (si el espacio es la letra más frecuente con diferencia lo normal será que el espacio se empareje con otro espacio), y el XOR entre iguales valdrá 0, valgan estos lo que valgan. De ahí que la letra más frecuente en el cifrado (la Ñ en éste caso) sea la representación del 0, es decir de la A (valor 0 en el alfabeto base) estará cifrada como Ñ,
Lo complicado de estas cosas a veces es explicarlas cuando muchas veces son ideas aún en desarrollo, difusas y a veces erróneas. Cuando el ataque ha tenido éxito es relativamente sencillo agrupar los conceptos que nos han llevado hasta allí, limpiarles la cara, peinarlos y presentarlos en sociedad. Entonces todo puede quedar claro y diáfano, pero prefiero ir contando las posibilidades que voy viendo, ya que si no soy yo a otro le puede inspirar una solución distinta o ver un error en el planteamiento. Creo que es mucho más didáctico y efectivo hacerlo así que tratar de trabajar individualmente y presentar un trabajo acabado al final.
La pega es que a veces tenéis que tratar con completas idas de olla, como el caso de los siameses en omelette XDD.
Magistral
Este post, que no tiene ninguna farfolla matemática -quizá por eso-, resulta de lo más formativo. Por ejemplo "no verlo como lo ha pensado quien lo ha diseñado", me parece un enfoque genial, que quizá es lo que no solemos hacer los demás, y nos emborricamos en dar vueltas a lo mismo. Por supuesto, hay ciertas habilidades que quizá no puedan ser enseñadas, como la creación de esos conceptos, "siameses", etc, que junto con la capacidad de formalizar la matemática del ataque hacen que unos sean geniales criptoanalistas, y otros del montón.
Gracias por esta valiosísima explicación.
Me temo que me voy a tener
Me temo que me voy a tener que ausentar otra temporada, así que no veréis mucha actividad mía durante unas semanas (no sé cuántas). Tampoco voy a poder ponerme con los retos. Pero de vez en cuando visitaré Kriptópolis y leeré cómo van las cosas, hasta que pueda volver a ponerme con los retos. Algún que otro comentario sí que podré poner
Es una pena
Es una pena no contar con tus ataques.
Un saludlo.
Páginas
opinar