Reto: Fucked-OTP (La venganza de AESito)

Imagen de Agustín
Enviado por Agustín en

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.

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...

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...

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.

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.

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.

ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
ÑJK:PGRMTLVDZ;SYQNIXF,CAWUE.BHO_

¿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...

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

Clave extendida: LOS_LAMELIBRANQUIOSMPT.MBNFMJCSB
Resultado:       *OS_LA*E*IBR**QUIOS***.*B*F*J*SB

Ahora a ver si junto ambas líneas y ultimo resultados.

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.

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.

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

"_" XOR "A" = "."
"_" XOR "E" = "Y"
"_" XOR "O" = "T"
"_" XOR "S" = "P"
"_" XOR "R" = "O"
"_" XOR "N" = "X"

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á:

C[i]=f'(f(A[i])^f(A[i-32]))

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):

Ci__nº__ %___%Regta_Ai
F 1090 15,22 17,599 _
O 0673 09,40 11,107 A
R 0622 08,68 10,160 E
E 0409 05,71 07,379 O
D 0360 05,03 05,841 S
X 0330 04,61 05,145 R
Z 0320 04,47 05,049 N
U 0253 03,53 04,974 I
A 0248 03,46 04,815 L
P 0236 03,30 03,875 D
_ 0217 03,03 03,324 U
I 0214 02,99 03,109 T
S 0204 02,85 03,018 C
T 0192 02,68 02,104 M
W 0179 02,50 01,958 P
J 0170 02,37 01,537 B
; 0129 01,80 01,503 .
L 0108 01,51 01,409 ,
Ñ 0106 01,48 01,025 Q
N 0105 01,47 00,893 V
B 0103 01,44 00,876 G
Q 0101 01,41 00,795 H
H 0100 01,40 00,785 Y
C 0098 01,37 00,487 F
, 0098 01,37 00,371 J
Y 0090 01,26 00,320 Z
K 0081 01,13 00,211 ;
M 0077 01,08 00,202 Ñ
V 0070 00,98 00,071 X
: 0068 00,95 00,054 :
G 0060 00,84 00,003 K
. 0051 00,71 00,001 W

Que si comprobamos contra una distribución regenta vemos que cuadra bastante. Según la distribución asignaríamos:

f'(f(_)^f(A))=O
f'(f(_)^f(E))=R
f'(f(_)^f(O))=E

Lo verificamos contra el alfabeto derivado real.

0....:....1....:....2....:....3.
ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,:;
FMKX;,HZJP.AEIGSW_NYBQTÑLCR:UODV

Vemos que acertamos con la "F". Comprobamos las parejas de XOR

f(_)=Q=17
f(A)=L=11
f(_)^f(A)=17^11=26
f'(26)=R
f(E)=M=12
f(_)^f(E)=17^12=29
f'(29)=O
f(O)=,=29
f(_)^f(O)=17^29=12
f'(12)=E

Vemos que nos bailan los 2 primeros, pero en general el método parece funcionar.

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.

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.

_____________1_2_3
f'(f(_)^(_))|Ñ Ñ 0
f'(f(_)^(A))|H C 1
f'(f(_)^(E))|C H 1
f'(f(_)^(O))|W W 0
f'(f(_)^(S))|B Y 5
f'(f(_)^(R))|Y J 1
f'(f(_)^(N))|K K 0
f'(f(_)^(I))|T T 0
f'(f(_)^(L))|P P 0
f'(f(_)^(D))|J B 4
f'(f(_)^(U))|; ; 0
f'(f(_)^(T))|G I 6
f'(f(_)^(C))|I A 1
f'(f(_)^(M))|L Z 1
f'(f(_)^(P))|A L 2
f'(f(_)^(B))|Z D 2
f'(f(_)^(.))|F X 2
f'(f(_)^(,))|D G 2
f'(f(_)^(Q))|Q F 5
f'(f(_)^(V))|X : 3
f'(f(_)^(G))|S , 2
f'(f(_)^(H))|V E 4
f'(f(_)^(Y))|. S 5
f'(f(_)^(F))|M Q 6
f'(f(_)^(J))|R R 0
f'(f(_)^(Z))|: V 6
f'(f(_)^(;))|, U 6
f'(f(_)^(Ñ))|E _ 6
f'(f(_)^(X))|U . 2
f'(f(_)^(:))|_ M 2
f'(f(_)^(K))|O N 1
f'(f(_)^(W))|N O 1

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.

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:

Secuencia ÑÑ_
 
C[i-96]=?, A[i-96]=_ 
C[i-64]=Ñ, A[i-64]=_ 
C[i-32]=Ñ, A[i-32]=_ 
C[i]=_, A[i]=Ñ, f(A[i])=0  
C[i+32]=A[i+32]

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.

Quizás lo que veis lioso

Es la función de sustitución. Os lo pongo con un ejemplo. Si tenemos el alfabeto derivado

0....:....1....:....2....:....3.
ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,:;
FMKX;,HZJP.AEIGSW_NYBQTÑLCR:UODV

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
--

[1] Estaba pensando, básicamente, en dos:

1.- La llamada "ley de la fatiga" que consistiría en que intentar asimilar una misma materia durante mucho tiempo sería menos eficaz que distribuirlo en dos o tres materias diferentes.

2.- La de "continuidad": el aprendizaje acerca de una determinada materia no cesa si pasamos a realizar otras actividades... Por ejemplo, al parecer; dormir es muy importante para "fijar" lo aprendido.

También pensaba en la de "repetición" (cuanto más se repite algo mejor se asimila o aprehende) pero ésta última ya dependerá de como, cada cual, quiera acomodarlo.

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.

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

Páginas

opinar

Texto puro

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