Reto resuelto: CHE (Cifrado Homofónico Evolutivo)

Imagen de LlamameX
Enviado por LlamameX en

Foros: 

Resuelto por tokamak. ¡Qué fiera!

Por LlamameX

Os presento a una de mis criaturas: CHE, que corresponde a las siglas de Cifrado Homofónico Evolutivo. Normalmente entendemos por homofónico un cifrado donde ampliamos el número de símbolos para compensar las desviaciones estadísticas derivadas del uso de un lenguaje. Mi idea, sin embargo, es mantener el mismo número de símbolos, pero adaptar el cifrado para compensar dichas desviaciones.

El principio es sencillo. Si ciframos un Ai como un determinado Ci, entonces, después de cifrar, cambiamos la sustitución f(Ai)=Ci por f(Ai)=Cj donde Cj es el carácter menos usado hasta el momento. De esta manera el cifrado evoluciona, tratando de igualar la frecuencia de todos los caracteres, obteniéndose la homofonía.

La adaptación será más equitativa cuanto mayor sea la cantidad de texto a cifrar, con lo que espero que sea adecuado para su uso en textos largos. El algoritmo además es perfectamente utilizable en un cifrado de lápiz y papel, puesto que no requiere calculos complejos. Para facilitar el ataque no he usado ninguna función complicada, sino simples sustituciones.

En el único punto donde he metido algo de complicación es en un tratamiento previo de la clave, que se invierte y se desordena a nivel de bits. Puede que ahí me haya pasado, pero MIMIC cayó estrepitosamente por tener la clave desprotegida y ahora me curo en salud. Obviamente CHE puede ser atacado por lemarios (mantengo el acuerdo tácito de usar texto inteligible en la clave), pero ahora será (espero) imprescindible acertar la clave entera, ya que el pretratamiento es lo suficientemente caótico para evitar convergencias.

 

El algoritmo en detalle

El primer paso, como ya he dicho, es proteger la clave y generar el alfabeto derivado. Dicho proceso se hace en tres pasos:

- Desordenar el alfabeto base en base a la clave.
- Proteger la clave con el alfabeto desordenado.
- Desordenar de nuevo con la clave protegida.

Estos pasos a su vez se llevan a cabo de la siguiente manera:

 

Desordenar el alfabeto base

El alfabeto base se desordena del mismo modo en que se hacía en MIMIC, es decir, se usa la clave como índice para ir extrayendo letras del alfabeto base, saltando tantas letras como la posición del carácter de la clave que estemos usando. Los saltos son cíclicos y si agotamos la clave volvemos a empezarla. Cuando hayamos extraído todas las letras habremos compuesto el alfabeto desordenado y habremos acabado. Por ejemplo, con la clave SANCHO haremos:

Primer carácter de la clave "S"=19. Avanzamos por el alfabeto base hasta la posición 19 obtenemos "S". Será el primer carácter del desordenado y lo extraemos del base. Ahora toca "A"=0. Avanzamos 0 y obtenemos "T" (hemos eliminado "S") la añadimos y la eliminamos del base. Siguiente carácter "N"=13 avanzamos cíclicamente 13 posiciones y llegamos a la posición 2, es decir "C". Seguimos hasta obtener:

STCFN;XYKÑZPOQHL,:IJRWMDV_AGEUB.

 

Proteger la clave

Dado que este desorden es bastante vulnerable, vamos a aplicar otro pero con una clave modificada. Los pasos son:

- Invertir la clave: SANCHO pasa a OHCNAS
- Convertir la clave a cadena de bits (5 por carácter) pero usando la representación del alfabeto desordenado :OHCNAS pasa a 011000111000010001001101000000
- Obtenemos un número de corte de la cadena multiplicando 17 por el valor en el alfabeto desordenado del último carácter de la clave y haciéndolo módulo la longitud de la cadena de bits. En este caso (17*12) mod 30 = 24.
- Cortamos la cadena de bits por ese punto y trasponemos ambos trozos: 011000111000010001001101000000 pasa a 000000011000111000010001001101
- Obtenemos la representación de la clave protegida reconvirtiendo bits a carácter por el alfabeto desordenado: 000000011000111000010001001101 pasa a SXYTCQ

 

Obtener el nuevo alfabeto desordenado

Usamos la nueva clave obtenida para desordenar una vez más el alfabeto ya desordenado (usamos el mismo sistema). Obtenemos:

JOYBTMHQ,Z:KXW.NPREAU_CSLG;ÑVDIF

 

Cuerpo del cifrado

Como ya he dicho, aunque el pretratamiento de la clave es complejo, el cuerpo del cifrado en sí es sencillo. Empezamos con una sustitución sencilla y vamos haciendo evolucionar el alfabeto desordenado.

Usamos como texto claro :

EN_UN_LUGAR_DE_LA_MANCHA

Tomamos el primer carácter "E" y lo sustituimos por "T" (posición 4 del alfabeto desordenado). A continuación sumamos 1 al contador de "T"s y buscamos el caracter menos usado (obviamente ahora todos estan a cero, salvo la "T"). El primero que encontramos con valor mínimo es la "J". Así pues intercambiamos "T" y "J" en el alfabeto desordenado obteniendo:

TOYBJMHQ,Z:KXW.NPREAU_CSLG;ÑVDIF

Repetimos el proceso para la "N" que cambiamos por "W". El carácter escogido como menos usado en el cifrado ahora es "T", por lo que los intercambiamos y obtenemos

WOYBJMHQ,Z:KXT.NPREAU_CSLG;ÑVDIF

Al final del proceso habremos obtenido el cifrado:

TWÑ_TWKÑHHETBJEWWJXX_YQQ

El descifrado no tiene demasiado secreto. Empezamos haciendo el mismo pretratamiento a la clave y alfabeto desordenado y deshacemos las sustituciones. Las alteraciones del alfabeto las haremos en base a los carácteres del cifrado que vamos tratando.

Si miramos las estadísticas de aparición, en un texto (http://llamamex.nixiweb.com/che/turing.txt) cifrado con la clave SANCHO (http://llamamex.nixiweb.com/che/turing_cifrado.txt) con unos 16.000 caracteres obtengo:

S [477]
T [559]
; [401]
. [421]
C [425]
H [538]
N [544]
K [565]
U [497]
_ [416]
M [641]
V [499]
W [638]
A [567]
Q [756]
F [609]
G [517]
I [602]
E [632]
R [460]
Ñ [373]
J [621]
D [458]
B [563]
, [455]
X [539]
: [325]
P [361]
Y [474]
O [397]
L [493]
Z [532]

Que para la simplicidad del sistema de igualado de frecuencias encuentro muy efectivo

 

Reto

El reto consiste en descifrar el siguiente cifrado:
http://llamamex.nixiweb.com/che/reto_cifrado.txt

Para que podáis jugar he subido una versión online a:
http://llamamex.nixiweb.com/che

Espero que os resulte tan divertido romperlo como a mí crearlo.

 

Mala pinta...

..tiene muy mala pinta... para nosotros claro, no para tí, que disfrutarás viéndonos sufrir. Bueno, empezaré a afilar la guadaña y a ver si encuentro por dónde clavársela a la criatura ésta, aunque va a ser difícil

¡Me encanta! es justo el tipo

¡Me encanta! es justo el tipo de cifrados que me gustan: un algoritmo sencillísimo generendo una elevada entropía, si no acabamos encontrando alguna debilidad podría ser un método práctico para cifrar en serio. Me pongo a implementarlo ya mismo.

Una pregunta rapidita: cuando

Una pregunta rapidita: cuando vamos a desordenar el alfabeto base por segunda vez los índices de la clave, que usamos para extraer caracteres del primer alfabeto modificado, son referidos al alfabeto base, A=0, B=1 ...¿o se refieren al modificado?

partiendo del alfabeto J O

partiendo del alfabeto J O Y B T M H Q , Z : K X W . N P R E A U _ C S L G ; Ñ V D I F tengo una pequeña discrepancia con el cifrado de ejemplo, no acabo de detectar donde está el fallo, yo obtengo paso a paso, acumulados, alfabeto y cifrado:

 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 T  O  Y  B  J  M  H  Q  ,  Z  :  K  X  W  .  N  P  R  E  A  U  _  C  S  L  G  ;  Ñ  V  D  I  F 
 T 
 
 00 00 00 00 01 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 W  O  Y  B  J  M  H  Q  ,  Z  :  K  X  T  .  N  P  R  E  A  U  _  C  S  L  G  ;  Ñ  V  D  I  F 
 T  W 
 
 00 00 00 00 01 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00
 Ñ  O  Y  B  J  M  H  Q  ,  Z  :  K  X  T  .  N  P  R  E  A  U  _  C  S  L  G  ;  W  V  D  I  F 
 T  W  Ñ 
 
 00 00 00 00 01 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 01 00 00 00 00
 _  O  Y  B  J  M  H  Q  ,  Z  :  K  X  T  .  N  P  R  E  A  U  Ñ  C  S  L  G  ;  W  V  D  I  F 
 T  W  Ñ _
 
 00 00 00 00 01 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 00 00 01 00 00 00 00
 T  O  Y  B  J  M  H  Q  ,  Z  :  K  X  _  .  N  P  R  E  A  U  Ñ  C  S  L  G  ;  W  V  D  I  F 
 T  W  Ñ  _  T 
 
 00 00 00 00 01 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 00 00 02 00 00 00 00
 W  O  Y  B  J  M  H  Q  ,  Z  :  K  X  _  .  N  P  R  E  A  U  Ñ  C  S  L  G  ;  T  V  D  I  F 
 T  W  Ñ  _  T  W 
 
 00 00 00 00 01 00 00 00 00 00 00 01 00 02 00 00 00 00 00 00 00 01 00 00 00 00 00 02 00 00 00 00
 K  O  Y  B  J  M  H  Q  ,  Z  :  W  X  _  .  N  P  R  E  A  U  Ñ  C  S  L  G  ;  T  V  D  I  F 
 T  W  Ñ  _  T  W  K 
 
 00 00 00 00 01 00 00 00 00 00 00 01 00 02 00 00 00 00 00 00 00 02 00 00 00 00 00 02 00 00 00 00
 Ñ  O  Y  B  J  M  H  Q  ,  Z  :  W  X  _  .  N  P  R  E  A  U  K  C  S  L  G  ;  T  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ 
 
 00 00 00 00 01 00 01 00 00 00 00 01 00 02 00 00 00 00 00 00 00 02 00 00 00 00 00 02 00 00 00 00
 H  O  Y  B  J  M  Ñ  Q  ,  Z  :  W  X  _  .  N  P  R  E  A  U  K  C  S  L  G  ;  T  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H 
 
 01 00 00 00 01 00 01 00 00 00 00 01 00 02 00 00 00 00 00 00 00 02 00 00 00 00 00 02 00 00 00 00
 O  H  Y  B  J  M  Ñ  Q  ,  Z  :  W  X  _  .  N  P  R  E  A  U  K  C  S  L  G  ;  T  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H 
 
 01 00 00 00 01 00 01 00 00 00 00 01 00 02 00 00 00 00 01 00 00 02 00 00 00 00 00 02 00 00 00 00
 O  E  Y  B  J  M  Ñ  Q  ,  Z  :  W  X  _  .  N  P  R  H  A  U  K  C  S  L  G  ;  T  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E 
 
 01 00 00 00 01 00 01 00 00 00 00 01 00 02 00 00 00 00 01 00 00 02 00 00 00 00 00 03 00 00 00 00
 O  T  Y  B  J  M  Ñ  Q  ,  Z  :  W  X  _  .  N  P  R  H  A  U  K  C  S  L  G  ;  E  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E  T 
 
 01 00 00 01 01 00 01 00 00 00 00 01 00 02 00 00 00 00 01 00 00 02 00 00 00 00 00 03 00 00 00 00
 O  B  Y  T  J  M  Ñ  Q  ,  Z  :  W  X  _  .  N  P  R  H  A  U  K  C  S  L  G  ;  E  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E  T  B 
 
 01 00 00 01 02 00 01 00 00 00 00 01 00 02 00 00 00 00 01 00 00 02 00 00 00 00 00 03 00 00 00 00
 O  J  Y  T  B  M  Ñ  Q  ,  Z  :  W  X  _  .  N  P  R  H  A  U  K  C  S  L  G  ;  E  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E  T  B  J 
 
 01 00 00 01 02 00 01 00 00 00 00 01 00 02 00 00 00 00 01 00 00 02 00 00 00 00 00 04 00 00 00 00
 O  E  Y  T  B  M  Ñ  Q  ,  Z  :  W  X  _  .  N  P  R  H  A  U  K  C  S  L  G  ;  J  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E  T  B  J  E 
 
 01 00 00 01 02 00 01 00 00 00 00 02 00 02 00 00 00 00 01 00 00 02 00 00 00 00 00 04 00 00 00 00
 O  W  Y  T  B  M  Ñ  Q  ,  Z  :  E  X  _  .  N  P  R  H  A  U  K  C  S  L  G  ;  J  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E  T  B  J  E  W 
 
 02 00 00 01 02 00 01 00 00 00 00 02 00 02 00 00 00 00 01 00 00 02 00 00 00 00 00 04 00 00 00 00
 W  O  Y  T  B  M  Ñ  Q  ,  Z  :  E  X  _  .  N  P  R  H  A  U  K  C  S  L  G  ;  J  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E  T  B  J  E  W  O 
 
 02 00 00 01 02 00 01 00 00 00 00 02 00 02 00 00 00 00 01 00 00 02 00 00 00 00 00 05 00 00 00 00
 W  J  Y  T  B  M  Ñ  Q  ,  Z  :  E  X  _  .  N  P  R  H  A  U  K  C  S  L  G  ;  O  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E  T  B  J  E  W  O  J 
 
 02 00 00 01 02 00 01 00 00 00 00 02 01 02 00 00 00 00 01 00 00 02 00 00 00 00 00 05 00 00 00 00
 W  X  Y  T  B  M  Ñ  Q  ,  Z  :  E  J  _  .  N  P  R  H  A  U  K  C  S  L  G  ;  O  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E  T  B  J  E  W  O  J  X 
 
 03 00 00 01 02 00 01 00 00 00 00 02 01 02 00 00 00 00 01 00 00 02 00 00 00 00 00 05 00 00 00 00
 X  W  Y  T  B  M  Ñ  Q  ,  Z  :  E  J  _  .  N  P  R  H  A  U  K  C  S  L  G  ;  O  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E  T  B  J  E  W  O  J  X  W 
 
 03 00 00 01 02 00 01 00 00 00 00 02 01 03 00 00 00 00 01 00 00 02 00 00 00 00 00 05 00 00 00 00
 X  _  Y  T  B  M  Ñ  Q  ,  Z  :  E  J  W  .  N  P  R  H  A  U  K  C  S  L  G  ;  O  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E  T  B  J  E  W  O  J  X  W _
 
 03 00 01 01 02 00 01 00 00 00 00 02 01 03 00 00 00 00 01 00 00 02 00 00 00 00 00 05 00 00 00 00
 X  Y  _  T  B  M  Ñ  Q  ,  Z  :  E  J  W  .  N  P  R  H  A  U  K  C  S  L  G  ;  O  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E  T  B  J  E  W  O  J  X  W  _  Y 
 
 03 00 01 01 02 00 01 01 00 00 00 02 01 03 00 00 00 00 01 00 00 02 00 00 00 00 00 05 00 00 00 00
 X  Q  _  T  B  M  Ñ  Y  ,  Z  :  E  J  W  .  N  P  R  H  A  U  K  C  S  L  G  ;  O  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E  T  B  J  E  W  O  J  X  W  _  Y  Q 
 
 04 00 01 01 02 00 01 01 00 00 00 02 01 03 00 00 00 00 01 00 00 02 00 00 00 00 00 05 00 00 00 00
 Q  X  _  T  B  M  Ñ  Y  ,  Z  :  E  J  W  .  N  P  R  H  A  U  K  C  S  L  G  ;  O  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E  T  B  J  E  W  O  J  X  W  _  Y  Q  X

El problema tiene que estar en el tratamiento de los acumulados, permuto los caracteres, pero no el acumulado correspondiente, no sé como debe tratarse realmente...

Si, es que en este paso

Si, es que en este paso

02 00 00 01 02 00 01 00 00 00 00 02 00 02 00 00 00 00 01 00 00 02 00 00 00 00 00 04 00 00 00 00
 W  O  Y  T  B  M  Ñ  Q  ,  Z  :  E  X  _  .  N  P  R  H  A  U  K  C  S  L  G  ;  J  V  D  I  F 
 T  W  Ñ  _  T  W  K  Ñ  H  H  E  T  B  J  E  W  O

Se han permutado la O y la W, y el índice con acumulado menor corresponde a la O, así que no sé la que estoy armando..

Estoy metiendo la pata,

Estoy metiendo la pata, seguro, pero no sé donde andará el problema en la línea discrepante:

00 00 00 00 01 00 01 00 00 00 00 01 00 02 00 00 00 00 00 00 00 02 00 00 00 00 00 02 00 00 00 00
H O Y B J M Ñ Q , Z : W X _ . N P R E A U K C S L G ; T V D I F
T W Ñ _ T W K Ñ H
E N _ U N _ L U G

Aquí tengo que codificar la A, que se corresponde en el alfabeto de arriba con la H, que añado al cifrado incrementando el contador de la H, permutándola después por el caracter de valor más bajo, que se corresponde con la O, dejando en la primera posición el contador de la H. Y así quedan los acumulados, el alfabeto y el cifrado:

01 00 00 00 01 00 01 00 00 00 00 01 00 02 00 00 00 00 00 00 00 02 00 00 00 00 00 02 00 00 00 00
O H Y B J M Ñ Q , Z : W X _ . N P R E A U K C S L G ; T V D I F
T W Ñ _ T W K Ñ H H
E N _ U N _ L U G A

Primeros resultados

Creo que he encontrado una vía de ataque, pero todavía tengo que desarrollarla. Expongo aquí lo que he conseguido hasta ahora.

Este ataque, si funciona, permitiría obtener el texto cifrado sin necesidad de conocer la clave.

En lo primero que tenenos que fijarnos es en que las estadísticas se llevan a cabo con las letras del criptograma, pero referidas al alfabeto ordenado. La búsqueda del carácter con menos frecuencia para intercambiarlo por el carácter usado también se hace sobre el alfabeto ordenado, aunque la posición luego se refiere al alfabeto desordenado. Teniendo en cuenta todo esto, podemos extraer algunas letras del texto en claro.

Veamos el siguiente caso, en una letra cualquiera del texto claro que va a ser cifrada. Tenemos un alfabeto desordenado, una letra del texto en claro, y queremos sustituirla por la correspondiente letra del alfabeto desordenado. Siguiendo el ejemplo dado en el reto, sea "E" la letra a cifrar, y sea "T" la letra correspondiente por la que se va a sustituir. En el criptograma aparecerá esta letra "T". Ahora, se suma 1 al contador de la letra "T", letra que se corresponderá con el alfabeto ordenado. Lo siguiente es el intercambio. Buscando la letra menos frecuente, vemos que es la "A", referida al alfabeto ordenado. Como su posición es la 0, intercambiaremos la letra del alfabeto desordenado que ocupe la posición 0 por la letra "T", que es la letra que ocupa la posición 4 (la "E"). Esto se repite para todas las letras del texto claro. Bien, pues ahora, tenemos la letra "T" en la posición 0. Si la siguiente letra es cualquier otra distinta de la "A", como la "A" era antes la letra de menor frecuencia, y no hemos incrementado su contador porque estamos con una letra distinta de la "A", seguirá siendo la que se intercambie por la otra letra. En el ejemplo, teníamos la letra del texto claro "N", que se corresponde con al "W" del alfabeto desordenado. Como se intercambia con la letra de menos frecuencia, que sigue siendo la "A", ahora la letra "W" estará en la posición 0. Ahora viene lo interesante: ¿qué ocurre si nos encontramos en el texto claro con la letra de menos frecuencia?. Pues resulta que en el criptograma aparecerá la letra que hubiera en la posición de esta letra, referida, como hemos visto, al alfabeto ordenado. Es decir, si después de la "N" viniera la "A", como la letra que hay en la posición 0 es la "W", en el criptograma aparecerá esta "W". Así, pues, si supiéramos en el criptograma que la letra "W" que acaba de aparecer está en la posición 0, sabríamos que la letra del texto claro sería la "A", es decir, que tendríamos una letra del texto claro.

Más interesante aún: a partir del criptograma, podemos hacer un seguimiento de las letras que se colocan en las posiciones de las letras de menor frecuencia. El procedimiento es simple. Sabemos que al comienzo del criptograma todas las frecuencias valen 0. Sabemos que se incrementan los contadores de las letras del criptograma cada vez que aparece una de ellas, y sabemos que estos contadores se refieren a letras del alfabeto ordenado. Así, pues, a partir del criptograma podemos hacer un seguimiento de la evolución de las frecuencias de las letras. Pero esto no es todo. Puesto que sabemos en todo momento las frecuencias de las letras, sabemos en todo momento cuál es la letra que se colocará en la letra de menor frecuencia. Es decir, que al comienzo del criptograma, sabemos que la letra "T" se colocará, en el alfabeto desordenado, en la posición 0, porque sabemos que ésa es la letra de menor frecuencia elegida. Lo que no podemos saber con este método es a dónde irá a parar la letra que había antes del intercambio en la posición de menos frecuencia. Así, pues, a medida que vamos avanzando por el criptograma, vamos determinando qué posición ocupan algunas letras dentro del alfabeto desordenado. Pues bien, si resulta que nos encontramos en el criptograma con una letra que está en una de estas posiciones de menor frecuencia, podemos determinar la letra del texto claro que le corresponde sin más que leer la letra que ocupa la misma posición en el alfabeto ordenado. Así, en el ejemplo, si después de la letra "W" nos encontramos con otra "W", puesto que sabemos que la "W" está en la posición 0, sabemos que esta segunda "W" se corresponde con la letra del texto claro "A".

Este método no permite obtener muchos caracteres (relativamente hablando), aunque puede dar pistas sobre el texto. Haciendo esto sobre el reto, me he encontrado con cosas interesantes. Por ejemplo, me he encontrado con la cadena "F ER A AEREA" en la posición 25714. Esta cadena es claramente "FUERZA_AEREA". Me he encontrado también muchas cadenas "ERRA", que con lo de "FUERZA_AEREA", lleva a pensar en la palabra "GUERRA". Otra cadena curiosa que me encontré un poco antes de la de "FUERZA_AEREA" es " F AFFE", que dado el contexto de guerra, hace pensar en la "LUFTWAFFE". Así, pues, parece que el texto original del reto va de la Segunda Guerra Mundial. Pensé en que quizá sería un artículo de la serie ENIGMA, pero no he conseguido cuadrar el texto. Tampoco he hecho una búsqueda exhaustiva. Dejo un enlace con los caracteres encontrados del texto en claro: https://sites.google.com/site/sqrmatrix/CHE_descifrado_parcial.txt?attre.... Espero que no tenga errores. El método lo probé con el ejemplo de 16KB que dejó LlamameX, y los caracteres encontrados a partir del criptograma coincidían con los del texto claro, por lo que deduje que el método funcionaba bien.

Ahora estoy trabajando en un ataque que me permita obtener un criptograma codificado con un único alfabeto a partir del reto. Si lo consigo, lo único que habría que hacer sería analizar las estadísticas de los caracteres. Por otro lado, los caracteres del texto claro hallados antes me darán directamente las codificaciones de algunos caracteres de este nuevo criptograma. Al intentar hacer este segundo método, me he encontrado con algún que otro obstáculo (en mi imaginación el método era simple, pero como de costumbre, lo que funciona muy bien en mi imaginación normalmente no funciona tan bien en la realidad :) ). Bueno, trabajaré sobre él cuando pueda, aunque entre semana no voy a poder trabajar mucho, sólo puedo dedicar algo de tiempo los fines de semana y festivos.

Espero que esto pueda ayudar a los demás a encontrar un ataque efectivo que permita obtener el texto original. Lo curioso de esto es que la clave no la hemos mencionado, y en el método en que estoy trabajando, si funciona, la clave no se utiliza.

Intentaré acabarlo, aunque

Intentaré acabarlo, aunque todavía no estoy seguro de que funcione. Como ya dije, en mi imaginación funciona muy bien, pero cuando me puse a implementarlo, me encontré con algunas cosas que no cuadraban. No sé si es que al implementarlo se me ha pasado algo de lo que pensé, o si pensé algo que no es correcto en la realidad. Bueno, el próximo fin de semana a ver si le dedico algo de tiempo

Sí, acábalo

Si puedes, y tienes tiempo, es bueno que lo acabes. Desde el punto de vista didactico aportaría mucho al tema, ya que el AG es una forma un tanto "ciega" de atacar el problema. Además puedes ponerle de corolario la obtención de la clave, que la hemos ido driblando todos.

El tema de la clave lo veo un

El tema de la clave lo veo un poco complicado. De momento no veo cómo atacarla, pero pensaré en ello. De todas formas, quizá se te ocurra un AG para atacarla, lo cual sería igualmente interesante. Creo que ahora el reto es descubrir la clave :)

YO MATÉ AL CHE

Es este texto sobre enigma:

http://es.wikipedia.org/wiki/Enigma_(m%C3%A1quina)

Lo he roto con mi parcheado AG; este es el resultado que me entregó de los primeros 256 caracteres:

ZNI;MA_PRB_PT_NOM.RP_DP_UNC_MEQUINF_QUP_DISLONIG_DP_UN_MPCHNISMO_DP_CIVRJDO_ROAAPORIO:_QUK_LÑRMIPIA_USARTA_PAN
PO_LARA_CIVRAR_COMO_LARA_DWSCIVRAR_MXNSAEES,_HARIOS_DE_SUS_MODETOS_YUERON_MUF_UPITIGADOS_EN_EUROLA_DESDE_I
NICIOS_DE_TOS_AZOS_,_SU_BAMA_SE_DE.E_A_W

Enigma era el nombre de una máquina...

Luego os daré detalles, estoy en pleno viaje...

Curiosidad y duda

No sé si lo habrán notado, pero en el cifrado de ejemplo se dan varios pares de letras repetidas. Un mínimo análisis muestra que tiene que ver con las apariciones de la letra A:

EN_UN_LUGAR_DE_LA_MANCHA
TWÑ_TWKÑHHETBJEWWJXX_YQQ
________^^_____^^_^^__^^

Por supuesto que en textos más largos no se da, aunque sí aparecen asociados los dobles caracteres a la misma letra durante un fragmento de texto, para luego pasar a otra y así. Por ej.:

OS_PRESENTO_A_UNA_DE_MIS_CRIATURAS:_CHE,_QUE_CORRESPONDE_A_LAS_SIGLAS_DE_CIFRADO_HOMOFONIC
NAÑPETOEWUJANJ_EANBOAX,TOOPXEWJOX,ITTQBDIRWQDDUJUWXÑD_YUQOUKQWOQPHUKOW_YOOQMJUWÑYTWATQADOO
________________________^^_________^^_______^^__________________________^^______________^^
                        _          _        _                           _               I

En el primer caso (texto corto), siempre la última letra usada para cifrar queda en el primer lugar del alfabeto desordenado. Por eso, la A toma el mismo caracter para cifrar que el anterior (porque busca la primera letra del alfabeto desordenado). Sin embargo, eso debería suceder si no se repiten letras usadas para cifrar (los contadores están en cero), pero no es así. Por lo tanto, veo que hay una parte del algoritmo que no entiendo... A ver, la explicación dice:

A continuación sumamos 1 al contador de "T"s y buscamos el caracter menos usado (obviamente ahora todos estan a cero, salvo la "T"). El primero que encontramos con valor mínimo es la "J". Así pues intercambiamos "T" y "J" en el alfabeto desordenado obteniendo:
TOYBJMHQ,Z:KXW.NPREAU_CSLG;ÑVDIF
Repetimos el proceso para la "N" que cambiamos por "W". El carácter escogido como menos usado en el cifrado ahora es "T", por lo que los intercambiamos y obtenemos

¿Cómo que es T? ¿El contador de T no está en 1?
Me falta resolver este punto para terminar de implementarlo, y ver si encuentro una debilidad asociada a las letras repetidas en el cifrado.
Gracias

Hola, Lucho.krp.

Hola, Lucho.krp.

En primer lugar, como habrás podido comprobar en los siguientes posts, tu observación es acertada y de no haberse resuelto el reto ya, quizá habías podido hacer avances interesantes, o incluso resolverlo.

Por otro lado, respecto a la pregunta que haces, las estadísticas se hacen con las letras del alfabeto desordenado, pero los contadores están en las letras del alfabeto ordenado, y luego, de nuevo, la letra que se elige es la del alfabeto desordenado. Al buscar la letra menos frecuente, buscamos por los contadores, que están asociados a las letras del alfabeto ordenado. En este caso, nos encontramos con la "A". Su posición es la 0, por lo que buscamos la letra en la posición 0 del alfabeto desordenado, y nos encontramos así con la letra "T".

Espero que la explicación sea entendible.

...Y como maté al che

Como decía el reto se corresponde con el texto de este artículo de Wikipedia sobre la máquina enigma

Aunque este cifrado utiliza una clave para desordenar el alfabeto inicial, en realidad podríamos plantear un ataque utilizando permutaciones de alfabetos directamente, prescindiendo completamente de la clave, siempre y cuando sea posible evolucionar hacia la solución, mediante pequeñas variaciones del alfabeto.

En cuanto obtuve una versión, no sé aún si completamente adecuada a las especificaciones del creador, comprobé como se pueden hacer converger el alfabeto inicial y la solución; véase el ejemplo a partir del cifrado TWÑ_TWKÑHHETBJEWOJXW_YQX, y cómo pequeños cambios del alfabeto modificado nos van aproximando hacia la solución:

JOYBTMHQ,Z:UXW.NPREAK_CSLG;ÑVDIF
EN_UN_TUGAR_DE_TA_MANCHA
OJBYTMHQ,Z:KXW.NPREAU_CSLG;ÑVDIF
EN_UN_LUGAR_CA_LE_MENDHE
JOYBTMHQ,Z:KXW.NPREAU_CSLG;ÑVDIF
EN_UN_LUGAR_DE_LA_MANCHA

Estaba aguardando a que Llamamex me dijese donde estaba la discrepancia entre su implementación del cifrario y la mía, pero como, de todas formas, y a pesar de la pequeña variación, se seguía manteniendo una cierta legibilidad en los descifrados de prueba, decidí implementar con ella un algoritmo genético.

Como los que utilizo habitualmente emplea una función de aptitud basada en el error cuadrático entre las frecuencias de monogramas, bigramas y trigramas del texto en claro generado por cada permutación de alfabeto analizado y las frecuencias de monogramas, bigramas y trigramas de un texto de referencia (Memorias de un ingeniero, de Alfredo Hoces -Fuckowski-)

Los alfabetos, de longitud fija, constituyen los cromosomas del AG, generándose automáticamente una población de un determinado número de individuos al comienzo del programa. Para este problema empleé un operador de cruce especial, el Order Crossover, que está basado en el orden en el que aparecen los genes (las letras). Para crear un descendiente, tomo un conjunto de genes de un cromosoma (alfabeto) padre, y el resto de las letras se copian con el mismo orden en que aparecen en el cromosoma del otro progenitor.

Este tipo de operador es el mismo que utilizo en un AG que criptoanaliza claves de substitución, donde se permutan alfabetos. Es decir: ni siquiera tuve que prepararlo.

Por su parte, el operador de mutación se limita a permutar aleatoriamente la posición de dos caracteres dentro de un cromosoma.
Luego, en cada paso del algoritmo, obtenemos el coste de la población, para lo cual generamos el texto en claro de los primeros 256 caracteres del cifrado, mediante el cromosoma (alfabeto) de cada individuo y calculamos la frecuencia de sus caracteres, bigramas, y trigramas y se obtiene el error cuadrático con respecto al texto de referencia.

Como de costumbre, los bigramas y trigramas del texto en claro se buscan en vectores ordenados utilizando una búsqueda binaria, pues de otra manera el tiempo empleado sería excesivo.

En fin, tuve que correr un poco, porque ya había cierto implacable sabueso detrás de la solución, desmantelando el tinglado a una velocidad que daba mucho miedo. Desde el móvil hice los cambios en el ordenador de casa, y, cosa rara, me dio la solución al primer intento.

La clave

Bueno, lo que faltaba era la clave, que es: MAQUINA_ENIGMA

Era previsible, la obtuve a base de tanteos, como la de MIMIC. En fin: no somos nada (y en bañador menos...)

Vale te lo explico:

Vale te lo explico:

Como ya estaba descifrado y sabía de que iba, y el título del artículo de wikipedia era Enigma (máquina) probé ENIGMA_MAQUINA sin éxito. Después, LA_MAQUINA_ENIGMA y nada, claro.

Luego ENIGMA, a secas, y ya por último: MAQUINA_ENIGMA

Por eso soy un genio ¿no? jajajaja

Conclusiones concluyentes

Después de estudiar muy atentamente los ataques a los últimos retos he llegado, no sin arduo esfuerzo, a las siguientes conclusiones concluyentes:

1.- el grupo de Vengadores que tenemos en Kriptópolis son realmente unos superhéroes del melón.
2.- las herramientas armamentísticas programatorias que emplean son de alta tecnología y eficacia probada.
3.- y la más importante: las mallas apretujadas del uniforme, de esas que no escapa ni un pedo, activan extraordinariamente las neuronas cerebrales gracias a una compresión inguinal uniforme en el cimbrel y las campanillas.

Ahora lo entiendo

Por fin he encontrado la explicación a esas marcas de frenazos que aparecían en la cara interna posterior de las mallas cuando me las traíais a lavar. Si es que todo tiene su explicación.

Falta conocimiento

Falta conocimiento de las costumbres espistolares, a pesar de las magníficas aportaciones que ha habido, y sobre todo falta un buen catálogo de abreviaturas al uso en esa época. Y faltan ganas de acometer la enésima transcripción del jeroglífico.

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.