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:

 

Es que ya que LlamameX ataca

Es que ya que LlamameX ataca a tu cifrado, alguien tiene que atacar al suyo ahora que se nos eclipsa momentánemamente Sqrmatrix. Sospecho que ya ha hecho sus propios intentos de auto-descriptado. Yo conseguí implementarlo a base de reciclar cachos de otro programa y convertir Javascript en Vbscript. También hice un intento de análisis por AGs, sin resultado. El análisis de frecuencias promente más, se repiten secuencias cifradas con el mismo texto claro.

Voy a intentar atacar con un AG

No se si siendo purista será un AG de verdad o una entelequia, pero le veo muchas posibilidades a una función de coste basada en la distancia recorrida en el descifrado de una columna partiendo de un valor conocido. Creo que si sale bien puedo ahorrarme mucho cálculo y sacar el alfabeto derivado. Ya os contaré.

Uy a mi no hagas mucho caso con eso

De hecho cojo lo que me interesa de la teoría purista y dejo correr el resto. Lo que voy a plantear es un criterio basado en la distancia que se recorre en el descifrado en cadena antes de desechar un candidato a alfabeto, si la distancia recorrida es superior a la de una versión anterior doy por buena la mutación y sigo mutando desde ahí, si no la descarto y pruebo aleatoriamente otra. Dentro de las posibilidades a mutar voy bajando la probabilidad de selección a los cambios que voy consolidando. No se si puedo caer en callejones sin salida, pero bueno, a ver que sale.

La cadena a descifrar será el siguiente trozo de una columna:

ÑP:;FÑÑIXA,,;FFZHBUQXÑÑÑXTYYÑ;MGZÑÑÑQNDULÑÑTZDLLÑPÑÑIY:;T.ÑXIQM:MLUYLLKUZ;PJOMS.MWZHS;N.IIFFÑT.,;:TL

Que puesto que sus carácteres anteriores son dos Ñ (con lo que la primera letra de la secuencia sería la tercera Ñ seguida), con lo que es muy probable que esa Ñ represente al XOR de 2 espacios en el claro, así que nuestro punto de partida en el claro es "_". Además la cadena tiene otras dobles y triples Ñs muy prometedoras. A partir de ahí a probar alfabetos a ver cuantos carácteres descifran sin salirse de los límites de una ditribución regenta para 100 letras. En el momento que esos límites se superan se mira hasta donde hemos llegado. Si llegamos a 100 tenemos alfabeto seguro.

Ya se que me faltan muuuchos elementos para llamar a esta entelequía AG y seguro que a estas alturas Tokamak se está echando las manos a la cabeza y exclamando ¡pero que barbaridad!, pero le voy a dar una oportunidad a la idea.

No es tan distinto

No es tan distinto, pero habría que hacer lo siguiente:

-Crear una población de a alfabetos distintos
-Después valoramos la aptitud de cada uno ellos, de acuerdo a la función propuesta
-Seleccionamos individuos para el cruce de forma aleatoriamente sesgada en función de la aptitud
-Cruzar dos a dos los individuos (alfabetos) seleccionados con un método que les permita mantener los 32 caracteres distintos, como con el Order Crossover, para generar uno o dos individuos nuevos.
-Con una cierta probabilidad (0.002, por ejemplo) mutar aleatoriamente un indivduo, permutando un gen (carácter) al azar por otro.
-Repetir n veces (generaciones) o hasta que la aptitud ya no progrese generación tras generación.
-Tomar el individuo con mejor aptitud, su genotipo (alfabeto) codificará la mejor solución hallada hasta el momento.

Tengo malas noticias para LlamameX

No se si es un error de implementación, del algoritmo, o del propio navegador, no me puse analizarlo demasiado.
Pero si cifro
AAAAAAAAAAQQQQQQQQQQWWWWWWWWWWEEEEEEEEEERRRRRRRRRRTTTTTTTTTTYYYYYYYYYY
con la clave
LOS_LAMELIBRANQUIOS
y luego la vuelvo descifrar obtengo AAAAAAAAAAQQQQQQQQQQWWWWWWWWWWEEEEEEEEEERRRRRRRRRRTTTTTTTTTTYYYYYYYYYFFFFFFFYFFFFFFFFFFFFFFFFFFF
fíjate que entre la penúltima Y y la ultima tenemos 7 Fs de caracteres de relleno.
Y un

No tengo esto abandonado

Aunque lo parezca. Eso si, voy al ralentí. Estoy haciendo encaje de bolillos con n-gramas en columna (apilar el texto en columnas y buscar n-gramas en ellos), con lo que voy consiguiendo algunas relaciones del estilo:

f(A)=f(.)^f(_)
f(E)=f(P)^f(_)
f(O)=f(Y)^f(_)
...

Con estas relaciones espero conseguir un juego de restricciones que me permita atacar el alfabeto derivado y obtener la clave.

Mis intentos con los AG no han sido demasiado satisfactorios. He visto que podría llegar a obtener la convergencia, pero partiendo desde resultados muy próximos a la solución, con lo que no me es nada útil.

Más que nada que se vea algo de actividad en estos temas, que ha caído en picado.

Más madera

Precisaría disponer de bastante más cantidad de texto cifrado con la misma clave. Este bichejo, aunque tiene sus debilidades, precisa de bastante estadística para atacarlo en condiciones y aún así va a costar, puesto que habrá que especular mucho.

Por otra parte, se me ocurre una cosa para un AG contra el alfabeto pero me cuesta acabar de plantearlo, a ver si a Tokamak se le ocurre como: La idea es que el XOR de las parejas sigue una distribución muy característica que depende de las probabilidades de cada uno de los integrantes. Esas probabilidades son fácilmente calculables para un alfabeto determinado. Se trataría de ir generando alfabetos cuyas probabilidades fueran acercándose al perfil de distribución que muestra el cifrado.

Por ejemplo, la "V" es el caracter más infrecuente. Que un carácter aparezca poco es por que las combinaciones que la generan aperecen poco. Una de esas 32 combinaciones tiene que incluir al "_", por lo que su alta frecuencia tiene que venir compensada por una muy baja, por ejemplo de la "W". Igualmente deberemos ir compensando el resto de caracteres probables con improbables hasta conseguir su distribución concreta o algún valor muy cercano. Pero determinar esas combinaciones también afecta al resto, puesto que cada pareja que asignemos a conseguir la "V" no la podemos asignar ya a conseguir otros carácteres, con lo que se generan restricciones para los alfabetos que derivemos desde ese.

Entonces se trataría de conseguir alfabetos congruentes desde distribuiones de probabilidad de sus parejas lo más cercanas posible a la de nuestro cifrado. A partir de un conjunto completo de relaciones ya debería ser fácil (dependerá de lo cíclicas que sean esas relaciones) obtener el alfabeto derivado y desde él la clave. Esto es lo que estoy intentando desde n-gramas en las columnas pero me hace falta mucha más casuística para cubrirlo todo, con lo que igual desde un AG pueda lograrse con menos esfuerzo. De todos modos los datos que más o menos tengo pueden incorporarse como parte de la configuración de salida. Los trios que más o menos cuadran (también podrían estar bailados algún caracter) son los siguientes:

Cada trio esta formado por valores ABC tales que f(A)=f(B)^f(C), siendo por tanto intercambiables entre ellos.

.A_ EAP PO_ EY_ .EO OAY XAS .TX .SN ESZ NLE

Nótese que todos ellos pueden ser generados por sólo 4 valores.

A ver si podemos cargarnos a este pequeño cabroncete, bastante más duro de roer de lo que parecía al principio.

Ah no no,

No tiene por que ser con la misma, lo decía por que en el otro reto me lo preguntaste. No es para hacer nada raro, sólo es para tener más texto. De todos modos si es la misma clave se resuelve el reto al averiguarla XDD.

Tener 2 textos con la misma clave, de todos modos, sólo será útil en el primer bloque de 32, puesto que desde ahí divergirán. Seguramente se podrá sacar alguna pista de ello, pero no es lo que tenía en mente.

El método es el que ya comentaba. Analizar n-gramas en vertical para sacar relaciones entre las f(A[i]), pero dado que ahí no hay estructura, sólo estadística de aparición de caracteres, necesito más material.

Hola, es muy interesante,

Hola, es muy interesante, pero no me acabo de enterar bien:

Se podría pensar en una población de individuos, cada uno de ellos formados por 32 parejas f(A)^F(B), inicialmente generadas al azar, y que luego irían evolucionando, pero ¿cómo evaluamos la aptitud de un alfabeto determinado? ¿como sé que es mejor o peor para nuestros fines que otro cualquiera?. Si puedo llegar a saber eso, entonces podría plantearlo fácilmente.

La idea es la siguiente

Partimos de las frecuencias de aparición de los carácteres en el cifrado (no de las letras en si, si no de sus frecuencias) expresada como números entre 0 y 1, es decir, tenemos una colección de 32 números. Esa será la distribución de referencia a la que nos hemos de acercar.

Por otra parte, un alfabeto dado generará una distribución de probabilidad determinada para las parejas de carácteres en base a las frecuencias teóricas de cada uno de ellos. Una pareja dada de LETRAS tendrá el valor del XOR de sus posiciones en el alfabeto y cada valor del XOR posible estará generado por 32 posibles parejas (16 en realidad, puesto que A^B es lo mismo que B^A). Así, mientras las posiciones siempre darán los mismos XORs, las letras que las ocupen tendrán mayor o menor probabilidad de aparecer, condicionando la distribución final.

Por ejemplo, en un caso muy básico, partimos de un alfabeto de 4 letras como el siguiente:

_________0123
alfabase ABCD

Donde supongamos que las frecuencias teóricas de los carácteres son las siguientes:

A 0.4
B 0.3
C 0.2
D 0.1

Imaginemos un albafeto candidato

_________0123
alfabase ABCD
derivado BADC

Un cifrado tipo Ci=f'(f(Ai)^f(Bi)) donde f(x) es la función de substitución y f'(x) su inversa genera esta tabla de XOR

_|_A_B_C_D
A| B A D C
B| A B C D
C| D C B A
D| C D A B

Las probabilidades de aparición de las letras serán pues

p[Ci="A"] = p[(f(Ai)="A" & f(Bi)="B") | (f(Ai)="B" & f(Bi)="A") | (f(Ai)="C" & f(Bi)="D") | (f(Ai)="D" & f(Bi)="C")]
p[Ci="B"] = p[(f(Ai)="A" & f(Bi)="A") | (f(Ai)="B" & f(Bi)="B") | (f(Ai)="C" & f(Bi)="C") | (f(Ai)="D" & f(Bi)="D")]
p[Ci="C"] = p[(f(Ai)="A" & f(Bi)="D") | (f(Ai)="D" & f(Bi)="A") | (f(Ai)="B" & f(Bi)="C") | (f(Ai)="C" & f(Bi)="B")]
p[Ci="D"] = p[(f(Ai)="A" & f(Bi)="C") | (f(Ai)="C" & f(Bi)="A") | (f(Ai)="B" & f(Bi)="D") | (f(Ai)="D" & f(Bi)="B")]

Es decir

p[Ci="A"] = 0.4*0.3 + 0.3*0.4 + 0.2*0.1 + 0.1*0.2 = 0.28
p[Ci="B"] = 0.4*0.4 + 0.3*0.3 + 0.2*0.2 + 0.1*0.1 = 0.30
p[Ci="C"] = 0.4*0.1 + 0.1*0.4 + 0.3*0.2 + 0.2*0.3 = 0.20
p[Ci="D"] = 0.4*0.2 + 0.2*0.4 + 0.3*0.1 + 0.1*0.3 = 0.22

Si esta distribución teórica se acerca a la real del cifrado es que vamos bien. Se trataría pues de buscar una función que nos mida la distancia entre distribuciones y usarla para buscar la convergencia. Como pegas es que las frecuencias en algunos casos sólo se diferencian en el tercer dígito decimal, con lo que el riesgo de falsos positivos y negativos es grande.

¿Lo ves posible?

Pero, con cada alfabeto que

Pero, con cada alfabeto que probásemos tendríamos que codificar un texto largo con él, para medir su distribución ¿no?, o bien probamos con las frecuencias reales de los caracteres del cifrado, como en la última tabla que nos pones. ¿Es así? Eso si lo podría hacer

Ah ya veo

Hay un problema de formato. Si te miras el fichero del dropbox verás que va hacuendo particiones cada tanto. ¿Tienes una versión bien concatenada aunque haya que meterla en un ZIP?. Si no ya mirare yo de generarme una.

Perfecto

Sí, se puede aplicar, ya sólo necesito un procedimiento sencillo para generar la tabla Xor de cada alfabeto, y me pongo a implementarlo. ¿Sugerencias?

Es decir, cómo genero esta tabla para cada alfabeto, cuál es el procedimiento:

1. _|_A_B_C_D	
2. A| B A D C	
3. B| A B C D	
4. C| D C B A	
5. D| C D A B

Pues como te decia

Tal y como se cifra f(Ai) es la posición en el derivado (en nuestro caso del candidato) de Ai si lo representamos como número, que es lo que nos interesa para el XOR. En el ejemplo f(C)=3. (Si lo representaramos como letra seria la correspondiente al alfabeto base en esa posición f(C)=D). La inversa f'(Ai) será la letra del alfabeto derivado de esa posición. En el ejemplo, si representamos como número f'(3)=C.(o f'(D)=C si se hace como letra)

Así por ejemplo en la posición de la tabla (1,2), empezando en 0, tenemos

f'(f(B)^f(C))=f'(0^3)=f'(3)=C

¡Por fin!. Sencillísimo, sí

¡Por fin!. Sencillísimo, sí,pero no lo acababa de coger. Me gustan tus ataques, por lo elegantes y "académicos" que son (una vez que los entiendo, horas o semanas después, claro).

En cuanto llegue a casa me pongo a implementarlo.

[3359] Resumen del magistral comentario

Puede que resumir aquí el magistral comentario «Me alegro que resulte interesante» del sábado 10 de noviembre de 2012 que no tiene ninguna farfolla matemática y que tan amablemente nos dejó LlamameX hace hoy, precisamente, un mes; nos permita llegar a entender algo más de todo este interesante y avanzado reto criptológico. Aunque el aparato matemático y la programación que se llegue a implementar nos sean inasequibles siempre puede quedar algo que despierte nuestra imaginación o siente las bases de su futura comprensión:

...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...
[...]
...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...
[...]
...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 este caso) sea la representación del 0, es decir de [que] 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... claro y diáfano, pero... ir contando las posibilidades... 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í...

Gracias por vuestro gran esfuerzo y paciencia para que quienes no tenemos una base matemática y de programación tan avanzada como ahora quisiéramos, podamos llegar a entender día a día, semana a semana... la casi totalidad de este singular reto.

Saludos cordiales,

Pedro Fernández
--

P.S. Puede que mi comentario haya quedado mal anidado dado que quería ubicarlo como respuesta al de LlamameX y ahora aparece en esta otra ubicación que es en mi opinión demasiado petulante porque quita protagonismo a los otros comentarios que son los verdaderamente importantes. Os ruego me disculpéis.

(Parcos) resultados hasta ahora

Bueno, ahora que Pedro nos ha refrescado un poco la memoria, os cuento lo que he conseguido, aunque me he desanimado un poco porque hasta ahora no he logrado que el algoritmo evolutivo converja adecuadamente.

Los alfabetos que logré tienen el espacio como A, lo que contradice el hallazgo de LlamameX, confirmado por Agustín.

Por ejemplo obtuve el siguiente alfabeto

_NMTLDEPSOCR;UAIZWFH,:X.BKJGÑVQY

Con su tabla de verdad:

   ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,:;
 
A  _XLRSÑ:VN,.C;IFPOZDEUTHYBWQAKJGM
B  X_FVQCTR.MNÑJKLWYEHZG:DOAPSBI;U,
C  LF_I;BWKDZHASRXTU,NMOP.GÑ:JCVQYE 
D  RVI_T.QXCYÑNPLK;MGAUESB,HJ:DFWZO
E  SQ;T_,V:OÑYMLPJINBUADRG.ZKXEWFHC
F  ÑCB.,_ONVSRXZHAG:;KJWYITLUMFDEPQ
G  :TWQVO_S,NMYKJPFÑDZHBXECULRG;IA.
H  VRKX:NS_ÑOC.WFIJ,UBGZQAMD;THLPEY
I  N.DCOV,Ñ_:XRUAHESWLP;MFQKZYIBGJT
J  ,MZYÑSNO:_TQBGEHVLWFK.PR;DCJUAIX
K  .NHÑYRMCXT_VGBDZQPFWJ,LSIEOKAU;:
L  CÑANMXY.RQV_EDBUTJI;POK:FG,LHZWS
M  ;JSPLZKWUBGE_TQRDÑOCNIYH,VFM:X.A
N  IKRLPHJFAGBDT_VSEYCOM;ÑZ.QWNX:,U
Ñ  FLXKJAPIHEDBQV_:GM.,YWNUCT;ÑRSOZ
O  PWT;IGFJEHZURS:_A.MNCL,BYXKOQVÑD
P  OYUMN:Ñ,SVQTDEGA_K;ILCJXWB.PZHFR
Q  ZE,GB;DUWLPJÑYM.K_:XVHTISNAQOCRF
R  DHNAUKZBLWFIOC.M;:_TSEXJV,GRÑYQP
S  EZMUAJHGPFW;CO,NIXT_RD:KQ.BSYÑVL
T  UGOEDWBZ;KJPNMYCLVSR_AQF:ÑHT,.XI
U  T:PSRYXQM.,OI;WLCHEDA_ZÑGFVUJKBN
V  HD.BGIEAFPLKYÑN,JTX:QZ_;RMUVCOSW
W  YOG,.TCMQRS:HZUBXIJKFÑ;_PANWEDLV
X  BAÑHZLUDK;IF,.CYWSVQ:GRP_OEXNMTJ
Y  WP:JKUL;ZDEGVQTXBN,.ÑFMAO_IYSRCH
Z  QSJ:XMRTYCO,FW;K.AGBHVUNEI_ZPLDÑ
_  ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,:;
.  KIVFWD;LBUAH:XRQZOÑY,JCENSP._TMG
,  J;QWFEIPGAUZX:SVHCYÑ.KODMRL,T_NB
:  GUYZHPAEJI;W.,OÑFRQVXBSLTCD:MN_K
;  M,EOCQ.YTX:SAUZDRFPLINWVJHÑ;GBK_

Que nos proporciona el siguiente listado de frecuencias. La primera columna de cifras son las frecuenciasde referencia que utilizo habitualmente, la segunda son las probabilidades de aparición de las letras del alfabeto analizado.

A  0,106986   0,064214357516
B  0,013542   0,01191100842
C  0,033297   0,040444778308
D  0,036594   0,044496100352
E  0,106384   0,06500673245
F  0,005786   0,011344897526
G  0,00962    0,011604496818
H  0,008776   0,011716339964
I  0,053403   0,056919937534
J  0,004041   0,011031990504
K  0,001332   0,011668498786
L  0,045599   0,043904276638
M  0,026104   0,03943300635
N  0,054498   0,05107505659
Ñ  0,001666   0,010488889728
O  0,07726    0,05518733168
P  0,022692   0,049501721508
Q  0,008763   0,012964618262
R  0,052071   0,048537527054
S  0,058429   0,060149632694
T  0,035702   0,04324255874
U  0,035253   0,045654180026
V  0,008987   0,012926529614
W  0,00073    0,011796457948
X  0,000985   0,011555496366
Y  0,008925   0,010291593988
Z  0,002875   0,010346573174
_  0,152612   0,073199956694
.  0,01494    0,012185295862
,  0,01046    0,011492353974
:  0,001323   0,011061423064
;  0,000365   0,034646381868

Como función de coste sumo las diferencias (en valor absoluto) de las frecuencias reales y de las probabilidades de aparición de cada caracter. Para este caso veréis que es 0,397340914192. Cuanto más pequeño, mejor.

Otros candidatos podrían ser:

_UDOTNIVRLYEMASP:HGK.,CÑF;JQZXWB     0,3975
_OISAERNW:CLKP,UXF;Q.ÑJVTBMYGHDZ     0,4313
_QA;PCZRTVI.XEGSMWDYFHK,N:LÑJOBU     0,4336 
_UDLSNTGMPOERIACXBF.HZ,YJW;Ñ:VQK     0,4146

Hasta ahora solo tengo esto, pero quizá se pueda perfeccionar. Espero sugerencias de la distinguida concurrencia..

Imagino que atacas el reto original

Si es así puedo darte algunas restricciones sacadas de los n-gramas que puedes mirar de incorporar (tengo algunas más en el segundo texto más largo). Hay que tener en cuenta, sin embargo, que las frecuencias de algunos caracteres pueden llevar a engaño, puesto que cuando nos vamos de las posiciones más frecuentes se contaminan mucho por resultados iguales pero de fuentes distintas. También la A y la E pueden intercambiar sus valores dependiendo del texto.

Las que obtuve para ese reto eran

Ñ**
.A_
EAP
PO_
EY_
.EO
OAY
XAS
.TX
.SN
ESZ
NLE
DR_

Cada trigrama ABC es una relación del tipo f(A)=f(B)^f(C), con lo que en la tabla vendría a ser A=f'(f(B)^f(C)). Ñ** indica que la Ñ es el elemento neutro, con lo que es válido para cualquier carácter *

Nuevos resultados

Bueno, ahora está mucho mejor. Aunque la convergencia es muy débil, la gráfica de la función de coste tiene muchos dientes de sierra, en vez de presentar un suave descenso uniforme.

(Aún no he aplicado las restricciones que me sugieren llamameX)

El primer alfabeto obtenido es éste:

ÑFUHPTAVXY_L.DM:;OGBCJNEIWR,QZKS

Con su tabla de verdad:

  ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,:;
 
A  ÑJGLOVCTKBIDX;AEURQWHPFSM:,._ZYN
B  JÑVKPGF;LADIZTBUE:Y.NOC_,RMWSXQH
C  GVÑWHJAE.F_SRUCT;XMLONBDQZYKI:,P
D  LKWÑR.SMJIBAH,DQYOEGX:_CTP;VFNUZ 
E  OPHRÑNTC:UYQWFEABLDXGJ;MSK_Z,.IV
F  VGJ.NÑBUWCS_:EF;TZ,KPHAIYXQLDRMO
G  CFASTBÑO_V.WQPGHNMXDE;JLR,:IKYZU
H  T;EMCUOÑ,NZXDJHGVSWQAFPRL_KY:I.B
I  KL.J:W_,ÑDABNMIYQPUVZRSF;OTGCHEX
J  BAFIUCVNDÑLK,HJPOY:_;EG.ZQXSWMRT
K  ID_BYS.ZALÑJ;XK:RUPF,QWVNEHCGTOM
L  DISAQ_WXBKJÑTZLR:EOCMY.GHUNFV;P,
M  XZRHW:QDN,;TÑIMS_GCOL.YEAVBPUJFK
N  ;TU,FEPJMHXZIÑNVG_.YBCO:KSLQRDWA
Ñ  ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,:;
O  EUTQA;HGYP:RSVOÑJDLMCBNXWI.,Z_KF
P  UE;YBTNVQOR:_GPJÑIK,FAHZ.DWMXSLC
Q  R:XOLZMSPYUEG_QDIÑAHWK,TCJFN;VB.
R  QYMED,XWU:POC.RLKAÑTSIZHGBV;NFJ_
S  W.LGXKDQV_FCOYSM,HTÑRZIAENUJBP;:
T  HNOXGPEAZ;,MLBTCFWSRÑVUQD.I:YK_J
U  PON:JH;FREQY.CUBAKIZVÑT,_LSXMWDG
V  FCB_;AJPSGW.YOVNH,ZIUTÑK:MRDLQXE
W  S_DCMILRF.VGE:WXZTHAQ,KÑO;PBJUNY
X  M,QTSYRL;ZNHAKXW.CGED_:OÑFJUPBVI
Y  :RZPKX,_OQEUVSYIDJBN.LM;FÑCHTGAW
Z  ,MY;_Q:KTXHNBLZ.WFVUISRPJCÑEOAGD
_  .WKVZLIYGSCFPQ_,MN;J:XDBUHEÑAOTR
.  _SIF,DK:CWGVUR.ZX;NBYMLJPTOAÑEHQ
,  ZX:N.RYIHMT;JD,_SVFPKWQUBGAOEÑCL
:  YQ,UIMZ.EROPFW:KLBJ;_DXNVAGTHCÑS
;  NHPZVOUBXTM,KA;FC._:JGEYIWDRQLSÑ

Que nos proporciona las frecuencias: (La primera columna de cifras son las frecuencias del reto original, la segunda la del alfabeto de acuerdo a la tabla de verdad.

A 0,020322 0,028954318048
B 0,023519 0,028983689484
C 0,031022 0,032373915204
D 0,033827 0,034060721236
E 0,019409 0,028715728074
F 0,033827 0,034055523566
G 0,016767 0,028634472116
H 0,022214 0,028968302934
I 0,032685 0,03243848157
J 0,02365 0,031384620416
K 0,027238 0,029044970812
L 0,030076 0,029470593148
M 0,030141 0,02908169542
N 0,020714 0,028497580804
Ñ 0,078908 0,037451091297
O 0,031511 0,031936623206
P 0,04893 0,035265867048
Q 0,031446 0,031672549174
R 0,024693 0,028845179786
S 0,020029 0,028818548354
T 0,045831 0,035475888826
U 0,020812 0,029058484762
V 0,01282 0,028886743304
W 0,021268 0,030723410456
X 0,045407 0,034836430786
Y 0,054541 0,035391363314
Z 0,029586 0,03159718451
_ 0,017811 0,028755584914
. 0,061587 0,03639529742
, 0,026129 0,028767756422
: 0,031217 0,029478103242
; 0,032066 0,031985280356

La suma de diferencias da 0,2482

En total obtuve tres alfabetos:

ÑFUHPTAVXY_L.DM:;OGBCJNEIWR,QZKS   0,2482
ÑCAVOFEGBJ:PQNX;TMLUZY,WSDKIR_.H   0,2488
ÑNULQCXGHIVYEDZKPAT,OW.RJ;_FS:BM   0,2493

Entonces ¿Sirven para algo?

No da resultados

Esos alfabetos generan las claves

RJRM,RÑJRRRRQJRPJJRJRRRRRRRJJPRR
GQGGZGG_PGGG__KGGHGGH_.J_GG_GZHG
L,AJA,AL:,L,SAL,,L,AAAALLAL:_ZEL

Claramente incorrectas. Por lo demás no se si das los pesos correctos para la comprobación puesto que queda una distribución muy plana. La distancia máxima entre valores en la distribución del cifrado es de 0.06 mientras que en la que obtienes es de 0.008.

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.