MTsaK: ¿Un cifrado por sustitución anti-ataques estadísticos?

Imagen de infosniper
Enviado por infosniper en

Foros: 

El Cifrado MTsaK

Mucho tiempo ha que la duda me consume.
Mucho tiempo ha que el congojo me acompaña.
Y hoy pongo al mundo por testigo que,
armado de valor,
decido ponerme en vuestras manos,
¡oh, grandes señores del oráculo!,
para que con vuestro don de la clarividencia
disipéis aquello que con gran infortunio corroe mis entrañas.
Como precio a vuestro esfuerzo
nada tengo con que pagaros.
Poca es mi gratitud para tanto que os merecéis,
pero más nada me queda
pues es lo que tiene la miseria.

 

Si alguien creía que el mensaje anterior tenía truco va equivocado; sólo pretendía llamar vuestra atención. Así que al lío, que se hace tarde y tengo el puchero en el fuego...

EL TABLERO DE JUEGO

Vamos a crear un tablero de 13 x 13 casillas (de las cuales quedarán libres 12 x 12) en el que más adelante ordenaremos nuestro alfabeto maestro. En él formamos el eje de abscisas (horizontal) por las letras minúsculas de la "a" a la "l" y el eje de ordenadas (vertical) por las minúsculas de la "m" a la "w" tal como se muestra:.

LAS FRECUENCIAS

Pueden encontrarse en internet distintos porcentajes para las frecuencias de las letras en castellano pero yo voy a basarme en los siguientes:

EL ALFABETO MAESTRO

Cogiendo estas frecuencias como válidas se creará un alfabeto que reduzca esos porcentajes hasta un mínimo más o menos manejable. Para ello se tomará ese porcentaje sin los decimales y se le sumará 2, quedando así:

18 E, 13 A, 10 O, 10 L, 9 S, 9 N, 8 D, 6 R, 6 U, 6 I, 5 T, 4 C, 4 P, 
4 M, 3 Y, 3 Q, 2 B, 2 H, 2 G, 2 F, 2 V, 2 J, 2 Ñ, 2 Z, 2 X, 2 K, 2 W

(Total 140 letras)

Y respecto a los espacios/separadores pondremos sólo cuatro - (guiones).

El alfabeto maestro quedará así compuesto por un total de 144 caracteres (12 x 12).

 

LA CONTRASEÑA

La contraseña la sacaremos de un libro de claves de fácil acceso desde internet quedando formada por una o más frases del mismo. ¿Y qué libro de claves podríamos usar para que, encima, no despierte sospechas?. Pues sencillo, el libro de género fantástico más conocido mundialmente, más incluso que El señor de los anillos: la Biblia. Pero como el recordar una frase (o más) como clave puede ser complicado bastará con que nos acordemos, por ejemplo, de "Génesis 6:5-6" de la versión Reina Valera de 1960 para que tras una rápida consulta en internet encontremos en http://www.biblia12.com/ o en http://www.amen-amen.net/RV1960/ la contraseña en cuestión:

"Y vio Jehová que la maldad de los hombres era mucha en la tierra, y que todo designio de los pensamientos del corazón de ellos era de continuo solamente el mal. Y se arrepintió Jehová de haber hecho hombre en la tierra, y le dolió en su corazón"

Pero para que la contraseña nos resulte útil deberá modificarse:

1.- Eliminamos espacios entre palabras:

YVIOJEHOVAQUELAMALDADDELOSHOMBRESERAMUCHAENLATIERRA,
YQUETODODESIGNIODELOSPENSAMIENTOSDELCORAZONDEELLOSER
ADECONTINUOSOLAMENTEELMAL.YSEARREPINTIOJEHOVADEHABERH
ECHOHOMBREENLATIERRA,YLEDOLIOENSUCORAZON

2.- Sustituimos los signos de puntuación por guiones (-):

YVIOJEHOVAQUELAMALDADDELOSHOMBRESERAMUCHAENLATIERRA-
YQUETODODESIGNIODELOSPENSAMIENTOSDELCORAZONDEELLOSER
ADECONTINUOSOLAMENTEELMAL-YSEARREPINTIOJEHOVADEHABERH
ECHOHOMBREENLATIERRA-YLEDOLIOENSUCORAZON

3.- Ahora vamos a acabar de perfilar esta clave según el número máximo de letras que el alfabeto maestro nos permite eliminando aquellas que excedan de la cantidad (contando de izquierda a derecha) y añadiendo al final de la clave las que faltan. O sea deberemos comenzar las cuentas por los 4 - [Atención, primero los 4 guiones], las 18 E, las 13 A, las 10 O, etc.). Nos quedará ésto:

YVIOJEHOVAQUELAMALDADDELOSHOMBRESERAMUCAENLATIERRA-
YQUETODODESIGNIODELOSPENSAMIENTOSDELCORAZNDEELLSER
AECNTINUSLAENTLA-YSPNJBCN-UZ-PPQGFFÑÑXXKKWW

144 caracteres en total. Ya tenemos la clave.

 

COLOCACIÓN DE LA CONTRASEÑA EN EL TABLERO

Se introducirá la clave carácter a carácter siguiendo el patrón en espiral que se propone de forma que el primero estará en la posición "fr", el segundo en la "fq", el tercero en la "gq", el cuarto en la "gr", el quinto en la "gs", el sexto en "fs", etc.

Así quedará distribuida la clave en el tablero:

YVIOJEHOVAQUELAMALDADDELOSHOMBRESERAMUCAENLATIERRA-
YQUETODODESIGNIODELOSPENSAMIENTOSDELCORAZNDEELLSERA
ECNTINUSLAENTLA-YSPNJBCN-UZ-PPQGFFÑÑXXKKWW

 

CÓMO CIFRAR UN TEXTO PLANO

Tenemos el texto plano siguiente (demasiado corto por lo que debe tomarse simplemente como ejemplo):

ESTE CIFRADO ES UNA CHUFA MACABEA

Lo reconvertimos a voluntad poniendo en el lugar de los espacios un guión, o sustituyéndolos por letras con frecuencia de muy poco uso y que no compliquen la comprensión del mensaje (W, K, X, o Z), o simplemente eliminamos los espacios:

ESTECIFRADOXESWUNAKCHUFA-MACABEA

Ahora vamos sustituyendo cada carácter del texto plano resultante por las coordenadas del tablero. Desde mi punto de vista no es necesario aplicar una aleatoriedad a la operación, simplemente bastará con mirar de repetir lo menos posible las coordenadas. Y éste es el texto cifrado resultante:

fn dn bn hñ dm bp lñ jn kn en cn lr bo añ lv gm 
am lt hn eo gñ lo cñ fm go ep gu aq cb hp br

 

EL RETO

im bn fo bñ kñ gñ eo dñ am go km jp bm kn fo iñ cn jq bo eñ
dr en gp fn ip ap dn cm fñ io kr eu jt kn cñ eq bt co lp dr
gr io ip hp cr hq iq du do jr an gp en cu kp ft fn js aq dq
ir gu er kr bu kt kq ar lq fu ho jn bv gñ hs dq et fo as añ
gt ao iw iu hp fs jt hr dn gq dm bs cr fv es eo fñ dñ dw em
in at hn hñ cñ ev br av kv ew ko ct bo dp am bt ep ds au an
eq hv jr ht cu gs jv it bm cw en jñ iq kñ jn js bn eu cm go
ku gv gn añ kn iv io fq co ao dm bv ip bñ cp do bu hq gñ hn
gu jp ht cq hr bp du gp fo ft dn dw ir ew fp kp aq bq fñ im
dp iw jq bo bt hs gq fr io et am cu km bv dr dv an dn br gt
fv ar as fm is fñ lm jt bu dñ iñ jm dt bs ln es gr ds ho im
hp kr gs iw hñ dp en cr at km ct aw gm fw bt au it kt bo hw
lñ ep ip cs cu jm in eu ks bv hq hv jw bm jv jr cñ dn iv ir
bp io kw cw fn cm hs bu js fu iw fñ iu dv iñ hu et kq dp bn
gu bñ gt cv gn cn jt jn eñ ev eo fo jt gñ kn añ ho hm kv bo
co gw kñ io go ao bt fq gq dq jp hp ko do cp gp bu cq fp jq
hr bp jo hñ is dm cu ap bv lp ep eq dr cr gr br ip iq ku jr 
kr js dt ds hq bq kp er ir dw ft kt jñ hs gu aq ew du ar av
dn fs fo et am em fw as fu fv bs gs iu lp ev it kñ gv kv an
cs es cñ gt iw fo kñ bo fñ go en jp io hn hw cq aw at jn dv
bo jt eu lm ct hp ht dp cr añ au hv iv kñ jw fs dñ go ao bt
io dñ iq hñ in bñ ks ep bu dn kw iw ip bm hq cv jv bo jp lq
cq eo ir gñ ko cw io jq ft fn bn bñ fn hs jr am fq an js gn
en dq kn cm et jn in gñ dr añ co gu fñ do cp bn eo gn ao gr
eq fo kn gq hr dp km gt dw ko co du hp do cp kr fp jt cr gp
ew bq bt am im jr kt lp fu cs dñ an ks kp en aq js lm cu cv
hñ gu ar jn fn fq hq cn bv bu ep añ

 

También puede descargarse desde aquí:

infosniper

Cifrado

Hola infosniper, estupendo reto para inaugurar el sitio. Por cierto, para la clave del reto ¿sigues tomando la Palabra de Dios en vano, o puede ser cualquier texto?

No está nada mal

Es un cruce entre Cifrado Homófono, ADFGVX, Rail Fence y Escítala, con algunas gotas de azufre. Creo que va a ser duro de roer. Si LlamameX no te hace una de sus mundialmente famosos javascripts, intentaré preparar una implementacioncita del bicho. Non nobis, domine, sed nomine tuo da gloriam

Uy pues a mi me ha recordado

a una de mis criaturas, el 36, una de las primeras aunque la mía era bastante más frágil, así a priori (os la merendásteis en un par de días).

Miraré de implementarlo, pero habrá que meterle un componente aleatorio para seleccionar el carácter.

Cosillas a priori

Primeras impresiones

- La clave forzosamente ha de ser muy larga ya que la hemos de reducir a 144 carácteres con un mínimo de aparición de las letras según las frecuencias. Eso casi seguro que implicará que se ha usado texto inteligible para crearla.
- La eliminación de los caracteres sobrantes dejará los más infrecuentes al final de la clave y mantendrá porciones considerables de la original (no reducida) al principio. Si se ha usado texto inteligible también lo encontraremos ahí.
- Las posiciones de la clave en el grid son fijas por lo que el texto infrecuente aparecerá en la misma posición. Por ejemplo deberíamos esperar pocas "l*" en el texto cifrado.

Pero va a costar...

Si si, seguro que se puede tunear

pero de todos modos las más probables (asumiendo siempre una clave con texto inteligible) ya las habremos ido usando con lo que nos quedarán pocas para meter en la última columna.

De todos modos, si la idea es un algoritmo mecanizable parece que dependemos demasiado de la "mala leche" del cifrador. Si se usa de manera más mecánica temo que se caerá en esas vulnerabildades.

eh, eh, que yo no lo he pedido XD

Esto ha sido un regalo por tu parte y Santa Rita Rita XD

Por lo demás, en un análisis básico de cryptool tenemos

Digrama Análisis de <Sin nombre1>. Tamaño del archivo 1622 bytes.
Ordenados descendentemente por frecuencia.
 
   Nº	  Subcadena	Frequencia (en %)	Frecuencia
    1	         io	         1.6917	      	9
    2	         bo	         1.5038	      	8
    3	         fo	         1.5038	      	8
    4	         bt	         1.3158	      	7
    5	         bu	         1.3158	      	7
    6	         dn	         1.3158	      	7
    7	         en	         1.3158	      	7
    8	         fñ	         1.3158	      	7
    9	         jt	         1.3158	      	7
   10	         añ	         1.1278	      	6
   11	         am	         1.1278	      	6
   12	         an	         1.1278	      	6
   13	         bv	         1.1278	      	6
   14	         cr	         1.1278	      	6
   15	         cu	         1.1278	      	6
   16	         dñ	         1.1278	      	6
   17	         dp	         1.1278	      	6
   18	         fn	         1.1278	      	6
   19	         gñ	         1.1278	      	6
   20	         gu	         1.1278	      	6
   21	         hp	         1.1278	      	6
   22	         hq	         1.1278	      	6
   23	         ip	         1.1278	      	6
   24	         iw	         1.1278	      	6
   25	         jn	         1.1278	      	6
   26	         jr	         1.1278	      	6
   27	         js	         1.1278	      	6
   28	         kñ	         1.1278	      	6
   29	         kn	         1.1278	      	6
   30	         ao	         0.9398	      	5
   31	         bñ	         0.9398	      	5
   32	         bn	         0.9398	      	5
   33	         co	         0.9398	      	5
   34	         do	         0.9398	      	5
   35	         dr	         0.9398	      	5
   36	         eo	         0.9398	      	5
   37	         ep	         0.9398	      	5
   38	         et	         0.9398	      	5
   39	         go	         0.9398	      	5
   40	         gp	         0.9398	      	5
   41	         gt	         0.9398	      	5
   42	         hñ	         0.9398	      	5
   43	         hs	         0.9398	      	5
   44	         ir	         0.9398	      	5
   45	         jp	         0.9398	      	5
   46	         kr	         0.9398	      	5
   47	         aq	         0.7519	      	4
   48	         ar	         0.7519	      	4
   49	         bm	         0.7519	      	4
   50	         cñ	         0.7519	      	4
   51	         cm	         0.7519	      	4
   52	         cp	         0.7519	      	4
   53	         cq	         0.7519	      	4
   54	         dq	         0.7519	      	4
   55	         du	         0.7519	      	4
   56	         dw	         0.7519	      	4
   57	         eq	         0.7519	      	4
   58	         eu	         0.7519	      	4
   59	         ew	         0.7519	      	4
   60	         fq	         0.7519	      	4
   61	         ft	         0.7519	      	4
   62	         fu	         0.7519	      	4
   63	         gn	         0.7519	      	4
   64	         gq	         0.7519	      	4
   65	         gr	         0.7519	      	4
   66	         hr	         0.7519	      	4
   67	         im	         0.7519	      	4
   68	         in	         0.7519	      	4
   69	         iq	         0.7519	      	4
   70	         jq	         0.7519	      	4
   71	         km	         0.7519	      	4
   72	         ko	         0.7519	      	4
   73	         kp	         0.7519	      	4
   74	         kt	         0.7519	      	4
   75	         lp	         0.7519	      	4
   76	         as	         0.5639	      	3
   77	         at	         0.5639	      	3
   78	         au	         0.5639	      	3
   79	         bp	         0.5639	      	3
   80	         bq	         0.5639	      	3
   81	         br	         0.5639	      	3
   82	         bs	         0.5639	      	3
   83	         cn	         0.5639	      	3
   84	         cs	         0.5639	      	3
   85	         ct	         0.5639	      	3
   86	         cv	         0.5639	      	3
   87	         cw	         0.5639	      	3
   88	         dm	         0.5639	      	3
   89	         ds	         0.5639	      	3
   90	         dv	         0.5639	      	3
   91	         es	         0.5639	      	3
   92	         ev	         0.5639	      	3
   93	         fp	         0.5639	      	3
   94	         fs	         0.5639	      	3
   95	         fv	         0.5639	      	3
   96	         gs	         0.5639	      	3
   97	         hn	         0.5639	      	3
   98	         ho	         0.5639	      	3
   99	         ht	         0.5639	      	3
  100	         hv	         0.5639	      	3
  101	         iñ	         0.5639	      	3
  102	         it	         0.5639	      	3
  103	         iu	         0.5639	      	3
  104	         iv	         0.5639	      	3
  105	         jv	         0.5639	      	3
  106	         ks	         0.5639	      	3
  107	         kv	         0.5639	      	3
  108	         lm	         0.5639	      	3
  109	         ap	         0.3759	      	2
  110	         av	         0.3759	      	2
  111	         aw	         0.3759	      	2
  112	         dt	         0.3759	      	2
  113	         eñ	         0.3759	      	2
  114	         em	         0.3759	      	2
  115	         er	         0.3759	      	2
  116	         fw	         0.3759	      	2
  117	         gv	         0.3759	      	2
  118	         hw	         0.3759	      	2
  119	         is	         0.3759	      	2
  120	         jñ	         0.3759	      	2
  121	         jm	         0.3759	      	2
  122	         jw	         0.3759	      	2
  123	         kq	         0.3759	      	2
  124	         ku	         0.3759	      	2
  125	         kw	         0.3759	      	2
  126	         lq	         0.3759	      	2
  127	         fm	         0.1880	      	1
  128	         fr	         0.1880	      	1
  129	         gm	         0.1880	      	1
  130	         gw	         0.1880	      	1
  131	         hm	         0.1880	      	1
  132	         hu	         0.1880	      	1
  133	         jo	         0.1880	      	1
  134	         lñ	         0.1880	      	1
  135	         ln	         0.1880	      	1

La cosa está en si la diferencia entre las frecuencias entre "IO" y "LN" dependen de efectos estadísticos o de la "mala leche" que decía del cifrador (¡no me contestes, que no quiero gastar mas comodines! XD ), quien puede haberse guardado una única "E" para cifrarla como "LN" para despistar, cosa que difícilmente implementaríamos en un sistema automatizado.

Para ilustrar, un mapa de "temperaturas" por frecuencia:

Sacar, lo que se dice sacar, pues poco

Antes que nada, gracias Admin por pegar la imagen.

Lo que venía a decir es que por construcción las últimas posiciones (concretamente la columna L) tendrá carácteres muy poco probables. De hecho en el reto acapara casi todos los ceros.

¿Qué se puede extraer de eso?, pues poco más que lo obvio, que los caracteres poco probables aparecen poco.

Ahora bien, parece que hay menos entropía de la que debería (no la he calculado) ya que hay bastante distancia entre las frecuencias más altas y las más bajas. También da la impresión de que determinados valores se han buscado o evitado adrede (como el 1 de la primera posición o el 4 de la última columna).

Dejar la elección en manos humanas tiene eso como ventaja e inconveniente. Por un lado puede sesgar la distribución (si no tiene cuidado) pero por otro puede decidir hacia donde orientar el sesgo.

Más. Porfa.

Hola, ¿por qué no nos pones más cifrado con esa clave? Sino me parece que MTsaK va a dormir el sueño de los justos, junto a mí TFTR. Después de todo la forma en que se reventaban las claves homofónicas en la guerra civil, era a base de ir juntando cifrados. Así veremos la resistencia de MTsak en un entorno "normal" ¿qué opinas?

Con mucho gusto

Con mucho gusto me pondría a implementar el engendro, pero sería mejor que lo hiciera LlamameX, porque estaría a la vista de todos, mientras que mis programas LOGO son una porquería.

De entrada ya veo que la espiral con la que se introduce la clave sólo es una complicación para el cifrador. En realidad es como si se fueran adjudicando las letras de la clave secuencialmente a esta lista de pares:

fr fq gq gr gs fs es er eq ep fp gp hp hq hr hs ht gt ft et dt ds dr dq
dp do eo fo go ho io ip iq ir is it iu hu gu fu eu du cu ct cs cr cq cp
co cñ dñ eñ fñ gñ hñ iñ jñ jo jp jq jr js jt ju jv iv hv gv fv ev dv cv
bv bu bt bs br bq bp bo bñ bn cn dn en fn gn hn in jn kn kñ ko kp kq kr
ks kt ku kv kw jw iw hw gw fw ew dw cw bw aw av au at as ar aq ap ao añ
an am bm cm dm em fm gm hm im jm km lm ln lñ lo lp lq lr ls lt lu lv lw

(s.e.u.o)

Lo siguiente es construir el alfabeto homofónico

E E E E E E E E E E E E E E E E E E A A A A A A A A A A A A A
O O O O O O O O O O L L L L L L L L L L S S S S S S S S S N N
N N N N N N N D D D D D D D D R R R R R R U U U U U U I I I I
I I T T T T T C C C C P P P P M M M M Y Y Y Q Q Q B B H H G G
F F V V J J Ñ Ñ Z Z X X K K W W - - - -

Luego, cuando se asigna la clave a los pares, se van restando del alfabeto las letras que se asignan.

A partir de ahí, hay que asignar a cada letra, el conjunto de pares que la representan, por ejemplo, la F está representada por los pares lñ y lo.

F -> [lñ lo]

De manera que cuando nos encontremos con una F en el texto a cifrar, iremos eligiendo aleatoriamente uno de los pares. Venga, LlamameX, ya te he hecho el análisis, el resto es fácil, salvo lo de meter ruido y caracteres extraños.

Desde el punto de vista del ataque, una vez que la serpiente -la espiral- ha sido eliminada, nos queda un cifrado más o menos homofónico, puro y duro. Como bien dice Tokamak, los cifrados homofónicos se rompen. Para ello hay que hacer uso de las características de la lengua, como que a toda "q" sigue una "u", etc. Pero eso no quiere decir que resulte fácil.

Implementación

Hola, estoy tratando de implementarlo pero tengo algunas dudas. Por ejemplo: tú cuentas la frecuencia de los caracteres del texto de clave, aunque ésta tenga una longitud mayor de 144. Por ejemplo, en este texto de 197 caracteres:

YVIOJEHOVAQUELAMALDADDELOSHOMBRESERAMUCHAENLATIERRA-
YQUETODODESIGNIODELOSPENSAMIENTOSDELCORAZONDEELLOSER
ADECONTINUOSOLAMENTEELMAL-YSEARREPINTIOJEHOVADEHABERH
ECHOHOMBREENLATIERRA-YLEDOLIOENSUCORAZON

cuentas 5 u, así que solo añades una al final.

Sin embargo. ¿No habría que truncar a 144 caracteres, de manera que al añadir las que faltan y quitar las que sobran la longitud de la clave siguiese en 144?

Es decir, tendríamos:

YVIOJEHOVAQUELAMALDADDELOSHOMBRESERAMUCHAENLATIERRA-
YQUETODODESIGNIODELOSPENSAMIENTOSDELCORAZONDEELLOSERADECONTINUOSOLAMENTEELMAL-
YSEARREPINTIOJ

y normalizando:

YVJVQUAALADDLSHBSEAMUCHAENLAERRA-
YQUETDDESIGNIODELOSPENSAMIENTOSDELCORAZONDEELLOSERADECONTINUOSOLAMENTEELMAL-
YSEARREPINTIOJ--UUCPPQBGFFÑÑZXXKKWW

No sé si lo he entendido bien.

Errorzuelo

He encontrado un errorzuelo en el ejemplo de MT-Sak. Resulta que la clave colocada -bizarramente, eso sí- sobre el tablero maldito, según MT-SaK es

YVIOJEHOVAQUELAMALDADDELOSHOMBRESERAMUCAENLATIERRA-
YQUETODODESIGNIODELOSPENSAMIENTOSDELCORAZNDEELLSERA
ECNTINUSLAENTLA-YSPNJBCN-UZ-PPQGFFÑÑXXKKWW

Y según LOGO sería:

YVIOJEHOVAQUELAMALDADDELOSHOMBRESERAMUCAENLATIERRA-
YQUETODODESIGNIODELOSPENSAMIENTOSDELCORAZNDEELLSERA
ECNTINUSLAENTLA-YSPNJBC-UZUPPQGFFÑÑXXKKWW-

(Las dos primeras líneas están bien)

Una de las causas de la divergencia es que en el ejemplo se asignan diez "N"s, mientras que en el alfabeto homofóbico sólo se establecen 9.

Hay otro problema en la asignación del 4º guión, que aún no he podido analizar.

Espero tus noticias, que mi modesta implementación está parada.

Err-orzuelo, again

Me temo que al MT-SaK le ha salido otro orzuelo, porque de las 6 "U"s que figuran en el alfabeto homofóbico, tan sólo se asignan 5 a la serpiente.

Eso, o es que no he pillado bien el algoritmo, que va a ser eso.

Ejemplo

Este es un ejemplillo de los resultados:

Clave

Y vio Jehová que la maldad de los hombres era mucha en la tierra, y que todo designio de los pensamientos del corazón de ellos era de continuo solamente el mal. Y se arrepintió Jehová de haber hecho hombre en la tierra, y le dolió en su corazón

Texto a cifrar

ESTE CIFRADO ES UNA CHUFA MACABEA

Clave frecuencias normalizadas

YVIJEVAQUELAMALADDELSHMBRESERAMUCHAENLATIERRA-
YQUETODODESIGNIODELOSPENSAMIENTOSDELCORAZONDEELLOSERADECONTINUOS---
EAALLSNNUUTCPPPYQBGFFJÑÑZXXKKWW

Cifrado:

fo,jñ,cm,kñ,jw,fw,ln,go,fn,kv,js,ju,dt,bm,ew,es,jw,ds,eq,ln,hs,hp,hs,cn,hs,jm,at,is

Descifrado:

ESTECIFRADOESUNACHUFAMACABEA

Yo creo que va bien, vosotros direis...

Pues yo diría

Yo diría que tienes mal la serpiente (revisa mis últimos posts). Para el texto

ESTECIFRADOXESWUNAKCHUFA-MACABEA

yo obtengo el cifrado

iw bs as fs hn jt ln cp cñ jq jñ lr eu bs lv cw bñ av ls hw es gñ lñ hr lw bq ht hw aq cm au fu

Hay que tener en cuenta que para cada letra caben varios pares, que se eligen aleatoriamente, por lo que hay un número indeterminado de cifrados válidos.

Te descifra bien, porque la mecánica es correcta, salvo en la obtención y asignación de la clave, que no se ajusta del todo a las especificaciones, como verás en mis posts.

Dónde se habrá metido LlamameX, igual ha preferido ganarse el jornal en vez de jugar a los cifrados. Hay gente muy interesada.

Pues parece que está bien

En principio parece correcto: Toma 144 caracteres de la clave, normaliza el número de cada caracter a los estándares, quitando o bien añadiendo al final, y después codifica asignando aleatoriamente el homófono correspondiente. ¿Dónde está mal?

Preparación de la clave: se toman 144 caracteres, se quitan los espacios, se ponen guiones en lugar comas y puntos:

YVIOJEHOVAQUELAMALDADDELOSHOMBRESERAMUCHAENLATIERRA-YQUETODODESIGNIODELOSPENSAMIENTOSDELCORAZONDEELLOSERADECONTINUOS

Se suprimen caracteres con frecuencias superiores a las esperables y se añaden al final las que falten. Empezando por los guiones, como dice el autor.

YVIJEVAQUELAMALADDELSHMBRESERAMUCHAENLATIERRA-YQUETODODESIGNIODELOSPENSAMIENTOSDELCORAZONDEELLOSERADECONTINUOS---EAALLSNNUUTCPPPYQBGFFJÑÑZXXKKWW

La clave

Aplicando las reglas, la clave me queda así:

YVIOJEHOVAQUELAMALDADDELOSHOMBRESERAMUCAENLATIERRA-YQUETODODESIGNIODELOSPENSAMIENTOSDELCORAZNDEELLSERA
ECNTINUSLAENTLA-YSPNJBC-UZUPPQGFFÑÑXXKKWW-

Hay algunas diferencias con la del autor, porque creo que no ha contado bien las Ns ni las Us, entre otras cosas.

Ya veo la diferencia

Es que tu suprimes las sobrantes a partir de la excedente: yo lo hago a posteriori, con lo que se eliminan desde el principo.

También las añades del mismo modo al final, yo también lo hago a posteriori.

No sé cual método será preferible, cualquiera es perfectamente válido, a ver que dice infosniper, antes de modificar nada.

Ahora sí, compadre

YVIOJEHOVAQUELAMALDADDELOSHOMBRESERAMUCAENLATIER
RA-YQUETODODESIGNIODELOSPENSAMIENTOSDELCORAZNDEE
LLSERAECNTINUSLAENTLA-YSPNJBC-UZ-UPPQGFFÑÑXXKKWW

El cifrado que yo obtengo usando aleatoriamente los pares equivalentes, es:

ir cv bn fs dm gq lo io kn ds in ls cq bs lw cw
ko cñ lt dm es gñ lñ et hm iu fu hw hr cm fv cñ

El programa LOGO está a tu disposicion, compadre -y de quien lo quiera-. Te lo mando a:

Inframundo
Séptimo Círculo
Novena caldera, por la derecha

Va por correo ordinario con franqueo en destino.

Aleatoriedad

En efecto, como las letras se corresponden con varios pares, se elige uno de ellos al azar. Eso libera al usuario de la tediosa responsabilidad de decidir cuál toma, y supongo que dificultará más el análisis estadístico.

Puedo preparar otra versión que lea directamente el fichero a cifrar, cuando éste sea demasiado grande para introducirlo línea a línea.

P.S.
Release note:
Cuando procesa el texto, además de quitar espacios, acentos y convertir todo a mayúsculas, toma como guiones "-" todos los caracteres que no pertenecen al alfabeto, tanto los signos de puntuación como signos de interrogación y admiración, paréntesis, arrobas, almohadillas y cagaditas de pájaro. Si se quiere que sólo algunos signos se conviertan en guiones habría que hacer una pequeña modificación. Ojo al parche.

Celebro que te haya gustado. Es un placer.

Ya está, he aquí la implementación definitiva

Bueno, ya está, el problema era que me auto-limitaba a 144 caracteres de clave, y así no había suficientes caracteres para añadir.

Esta es:

Function meter(clave, texto0)
texto = Mid$(texto0, 1, 144)
texto = UCase(texto)
 
texto = Replace(texto, "Á", "A")
texto = Replace(texto, "É", "E")
texto = Replace(texto, "Í", "I")
texto = Replace(texto, "Ó", "O")
texto = Replace(texto, "Ú", "U")
 
texto = Replace(texto, " ", "")
texto = Replace(texto, ",", "-")
texto = Replace(texto, ".", "-")
 
For i = 1 To Len(texto)
  letra = Mid$(texto, i, 1)
  par = asigna_par(letra, clave)
  cifra = cifra & par
  If i < Len(texto) Then cifra = cifra & ","
Next i
meter = cifra
 
End Function
Function asigna_par(letra, clave)
Dim homo(18) As Integer
Dim tablero
 
tablero = Array("fr", "fq", "gq", "gr", "gs", "fs", "es", "er", "eq", "ep", "fp", "gp", "hp", _
"hq", "hr", "hs", "ht", "gt", "ft", "et", "dt", "ds", "dr", "dq", "dp", "do", "eo", "fo", _
"go", "ho", "io", "ip", "iq", "ir", "is", "it", "iu", "hu", "gu", "fu", "eu", "du", "cu", _
"ct", "cs", "cr", "cq", "cp", "co", "cñ", "dñ", "eñ", "fñ", "gñ", "hñ", "iñ", "jñ", "jo", _
"jp", "jq", "jr", "js", "jt", "ju", "jv", "iv", "hv", "gv", "fv", "ev", "dv", "cv", "bv", _
"bu", "bt", "bs", "br", "bq", "bp", "bo", "bñ", "bn", "cn", "dn", "en", "fn", "gn", "hn", _
"in", "jn", "kn", "kñ", "ko", "kp", "kq", "kr", "ks", "kt", "ku", "kv", "kw", "jw", "iw", _
"hw", "gw", "fw", "ew", "dw", "cw", "bw", "aw", "av", "au", "at", "as", "ar", "aq", "ap", _
"ao", "añ", "an", "am", "bm", "cm", "dm", "em", "fm", "gm", "hm", "im", "jm", "km", "lm", _
"ln", "lñ", "lo", "lp", "lq", "lr", "ls", "lt", "lu", "lv", "lw")
 
c = 0
For i = 1 To Len(clave)
  If letra = Mid$(clave, i, 1) Then
    c = c + 1
    homo(c) = i
  End If
Next i
 
cual = Int((c * Rnd) + 1)
 
r = homo(cual)
r = r - 1
 
asigna_par = tablero(r)
 
End Function
Function sacar(clave, texto)
 
Dim tablero
 
tablero = Array("fr", "fq", "gq", "gr", "gs", "fs", "es", "er", "eq", "ep", "fp", "gp", "hp", _
"hq", "hr", "hs", "ht", "gt", "ft", "et", "dt", "ds", "dr", "dq", "dp", "do", "eo", "fo", _
"go", "ho", "io", "ip", "iq", "ir", "is", "it", "iu", "hu", "gu", "fu", "eu", "du", "cu", _
"ct", "cs", "cr", "cq", "cp", "co", "cñ", "dñ", "eñ", "fñ", "gñ", "hñ", "iñ", "jñ", "jo", _
"jp", "jq", "jr", "js", "jt", "ju", "jv", "iv", "hv", "gv", "fv", "ev", "dv", "cv", "bv", _
"bu", "bt", "bs", "br", "bq", "bp", "bo", "bñ", "bn", "cn", "dn", "en", "fn", "gn", "hn", _
"in", "jn", "kn", "kñ", "ko", "kp", "kq", "kr", "ks", "kt", "ku", "kv", "kw", "jw", "iw", _
"hw", "gw", "fw", "ew", "dw", "cw", "bw", "aw", "av", "au", "at", "as", "ar", "aq", "ap", _
"ao", "añ", "an", "am", "bm", "cm", "dm", "em", "fm", "gm", "hm", "im", "jm", "km", "lm", _
"ln", "lñ", "lo", "lp", "lq", "lr", "ls", "lt", "lu", "lv", "lw")
 
For i = 1 To Len(texto) Step 3
 uno = Mid$(texto, i, 2)
 For j = 0 To 143
   If uno = tablero(j) Then
      c = j + 1
      claro = claro & Mid$(clave, c, 1)
      Exit For
   End If
 Next j
Next i
 
sacar = claro
 
End Function
Function haz_clave(texto0)
 
 
If Len(texto0) < 144 Then Exit Function
texto = UCase(texto0)
 
texto = Replace(texto, "Á", "A")
texto = Replace(texto, "É", "E")
texto = Replace(texto, "Í", "I")
texto = Replace(texto, "Ó", "O")
texto = Replace(texto, "Ú", "U")
 
texto = Replace(texto, " ", "")
texto = Replace(texto, ",", "-")
texto = Replace(texto, ".", "-")
 
'texto = Mid$(texto, 1, 144)
 
For i = 1 To Len(texto)
If Mid$(texto, i, 1) = "U" Then k = k + 1
Next i
 
alfabeto = Array("-", "E", "A", "O", "L", "S", "N", "D", "R", "U", "I", "T", "C", "P", "M", "Y", "Q", "B", "H", "G", "F", "V", "J", "Ñ", "Z", "X", "K", "W")
frecuencias = Array(4, 18, 13, 10, 10, 9, 9, 8, 6, 6, 6, 5, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
 
Dim cuentas(27)
 
For i = 1 To Len(texto)
letra = Mid$(texto, i, 1)
For j = 0 To 27
If letra = alfabeto(j) Then x = j: Exit For
Next j
cuentas(x) = cuentas(x) + 1
Next i
 
texto2 = StrReverse(texto)
For j = 0 To 27
r = Abs(cuentas(j) - frecuencias(j))
If cuentas(j) > frecuencias(j) Then
texto2 = Replace(texto2, alfabeto(j), "", 1, r)
End If
Next j
texto = StrReverse(texto2)
 
For j = 0 To 27
If cuentas(j) < frecuencias(j) Then
r = Abs(cuentas(j) - frecuencias(j))
texto = texto & String(r, alfabeto(j))
End If
Next j
 
haz_clave = texto
 
End Function

Clave:

YVIOJEHOVAQUELAMALDADDELOSHOMBRESERAMUCAENLATIERRA-YQUETODODESIGNIODELOSPENSAMIENTOSDELCORAZNDEELLSERAECNTINUSLAENTLA-YSPNJBC-UZ-UPPQGFFÑÑXXKKWW

Cifrado:

fn,bs,bn,eu,hn,bp,lñ,jn,jw,gv,gr,lr,kv,bw,lv,im,at,ep,lu,hn,eo,fm,lñ,cñ,ap,go,br,hw,et,ho,kr,jw

Descifrado:

ESTECIFRADOXESWUNAKCHUFA-MACABEA

En el Botón Microsoft Office escojer sucesivamente:

- opciones de Excel
- Más frecuentes
- Mostrar ficha Programador
- Grupo Código
- Visual Basic
- Insertar Módulo
- Archivo Cerrar

Para obtener la clave de un texto, situado por ejemplo en la celda de Excel A60:

=haz_clave(A60)

para cifrar

=meter(A1;A62)

para descifrar

=sacar(A1;A2)

Lo bueno, si poco...

...y de lo malo, lo menos. Así me curo en salud, me gustan las cosas claritas y manejables, para tirar millones de líneas ya están los esclavos de Microsoft.

Por cierto, si miras TFTR el código aún es menor...y el reto sigue resistiendo. Ahora estoy pensando en algo AÚN más minimalista.

MtsaK no creo que se pueda resolver, a menos que se disponga de suficiente texto. Las claves homofónicas, si el texto es corto y se reparten con cuidado los homófonos son dificilísimas de romper, pero son engendros de laboratorio.

La gracia está en que en condiciones reales, esas circunstancias nunca se cumplen, vease el archiconocido episodio de la captura del "Mar Cantábrico" durante la Guerra Civil: los republicanos siguieron utilizando la Clave X -homofónica- aún después de la captura del buque, para gozo del Servicio de Descriptado Nacional que operaba en Mallorca.

Utilizando un programa puede que las frecuencias se repartan mejor que a mano pero claro, usando la función RND seguro que no vamos a llegar excesivamente lejos..

Pueees...todo lo que puedas

Los criptosistemas con homófonos pueden llegar a ser extremadamente difíciles de romper, especialmente si la asignación de tales valores no sigue una lógica como en los ejemplos anteriores, en que éstos eran obtenidos a partir de un texto muy conocido

http://es.scribd.com/doc/67404111

..que será poco, mira la cifra de Beale, o el criptograma del asesino del Zodiaco. Ahí siguen.

Como ejecutar el código VBA en Excel 2003

Como me habéis preguntado sobre como ejecutar el código, os pongo este breve resumen, para Excel 2003

Primero abrid el editor VBA:

https://sites.google.com/site/callaeciarisit/explicacion1.JPG

Después insertáis un nuevo módulo:

https://sites.google.com/site/callaeciarisit/explicacion2.JPG

Ahí pegáis el código propuesto:

https://sites.google.com/site/callaeciarisit/explicacion3.JPG

Cerráis el editor y ponéis la clave y el texto en claro en cualquier celda de la hoja. Además en otra, en este caso en A1, hay que llamar a la función de construcción de clave, pasándole como parámetro la referencia a la celda que contiene la clave, A8:

https://sites.google.com/site/callaeciarisit/explicacion4.JPG

Esto nos construye la clave:

https://sites.google.com/site/callaeciarisit/explicacion5.JPG

Ahora llamamos a la función de codificar, "meter", pasándole como parámetros las celdas donde están la clave y el texto (A1;A11):

https://sites.google.com/site/callaeciarisit/explicacion6.JPG

La función para descifrar es "sacar":

https://sites.google.com/site/callaeciarisit/explicacion7.JPG

Espero que haya quedado claro, el VBA es algo extraordianario que convierte Excel (y a Open Office) en unas herramientas poderosísimas.

Imágenes: 

Leer de un fichero

Si añades esta función al final del código, te devolverá en una celda de excel el contenido de un fichero. Además te convertirá el texto pasándolo a mayúsculas, quitando acentos, espacios, poniendo guiones, etc:

Está limitado al tamaño máximo de variable en vba, pero con ficheros pequeños, de 20 Kb o así, va bien. Si necesitas procesar archivos más grandes preparo una función que coja de un fichero y deje el cifrado en otro. Es un momento.

Hay que pasarle como parámetro el path completo del fichero:

Function toma_archivo(direccion)
 
Open direccion For Input As #13
Do While Not EOF(13)
   caracter = Input(1, #13)
   caracter = UCase(caracter)
   If caracter = "Á" Then caracter = "A"
   If caracter = "É" Then caracter = "E"
   If caracter = "Í" Then caracter = "I"
   If caracter = "Ó" Then caracter = "O"
   If caracter = "Ú" Then caracter = "U"
   If caracter = "." Then caracter = "-"
   If caracter = "," Then caracter = "-"
   If (caracter = "A" Or caracter = "B" Or caracter = "C" Or caracter = "D" Or caracter = "E" Or caracter = "F" Or caracter = "G" Or caracter = "H" Or caracter = "I" Or caracter = "J" Or caracter = "K" Or caracter = "L" Or caracter = "M" Or caracter = "N" Or caracter = "Ñ" Or caracter = "O" Or caracter = "P" Or caracter = "Q" Or caracter = "R" Or caracter = "S" Or caracter = "T" Or caracter = "U" Or caracter = "V" Or caracter = "W" Or caracter = "X" Or caracter = "Y" Or caracter = "Z" Or caracter = "-") Then
      texto = texto & caracter
   End If
  Loop
Close #13
toma_archivo = texto
End Function

Muy interesante

En otros tiempos conseguí implementar algún cifrado en Hoja de Cálculo a base de intoducir muchas celdas auxiliares que ejecutaban funciones numéricas y de string. De esta otra forma es mucho más claro y eficiente.

Buen trabajo.

Al ataqueeeel

Se agradece el agradecimiento. Pero ahora toca el ataque. Un cifrado homofónico nunca lo es bastante. En el caso que nos ocupa debería haber más símbolos para la E y para la A. De hecho podría haberlos, sin más que formar un tablero más grande, por ejemplo de 27x27, o más grande aún.

Como tenemos 144 pares, si la homofonía fuera perfecta, esperaríamos una frecuencia bastante uniforme, en torno a 1/144 = 0.69 % para cada uno de ellos, en el cifrado. Pero, tomando por el ejemplo el caso de la E, al que se le supone una frecuencia relativa de un 16.78 % en el idioma, al representarla mediante 18 pares es de esperar que la frecencia real de cada uno en el cifrado sea de 16,78/18 = 0.93%, bastante mayor que el valor promedio 0.69%. Algo parecido ocurrirá con los símbolos de A, O, L, S, N y D. En cambio, los pares asignados a R, U, I, T, C, P están mucho más ajustados. Después, desde la M hasta la W, el número de pares asignados es mayor de lo que sería correcto, por lo que es de esperar que se obtengan valores más bajos que 0.69% para sus frecuencias en el cifrado.

En suma, encontraremos pares con frecuencias mayores que 0.69 %, que supuestamente corresponderan a las letras más frecuentes del idioma, luego un grupo de pares con frecuencias más ajustadas al 0.69%, en la zona media, y valores de frecuencias inferiores a 0.69 % que corresponderían a las letras menos frecuentes en el idoma. Por otra parte tendremos la conducta de los cuatro símbolos asignados al guión. Si se hubiera asignado al espacio hubiera necesitado casi 30 símbolos, o sería fácilmente detectable por su mayor abundancia, pero el malvado infosniper ha suprimido hábilmente los espacios. Sin embargo, se dispone de la frecuencia de algnos signos de puntuación, en el caso de la Regenta. Concretamente conocemos la frecuencia de los signos "." "," ";" y ":", que automáticamente se asignarán al guión "-". Y la frecuencia será mayor aún porque todo carácter que no corresponda a las letras del alfabeto (admiraciones, interrogaciones, paréntesis, números, etc.) se traducen en guiones en el algoritmo que le hemos suministrado al Maléfico. Que conste que no ha sido intencionado, que uno no piensa tanto cuando lo que le preocupa es que el programa funcione de una maldita vez. Pero visto ahora es como si le hubiéramos colado una pequeña puerta trasera. En efecto, la suma de las frecuencias de los citados signos de puntuación es de 3.86%, que repartido entre los cuatro pares asignados nos da 0.97, o quizá supere el valor de los pares de la A. Ya se verá

Me he permitido tomar los valores de frecuencias de la Regenta, en vez de los que propone el autor, eliminado la del espacio. Eso cambia bastante los valores de algunas de ellas, como la de la propia E. Las cuentas que me salen son:

Car	Frec	Rep	Frec pares
a 	13,48	13 	1,04
r 	06,24	06 	1,04
i 	06,04	06 	1,01
- 	03,86	04 	0,97
b 	01,86	02 	0,93
c  	03,66	04 	0,92
o 	08,96	10 	0,90
s 	07,09	09 	0,79
t 	03,77	05 	0,75
e 	12,33	18 	0,69
n 	06,13	09 	0,68
u 	04,03	06 	0,67
m 	02,55	04 	0,64
p 	02,38	04 	0,60
d 	04,70	08 	0,59
l 	05,84	10 	0,58
v 	01,08	02 	0,54
g 	01,06	02 	0,53
h 	00,97	02 	0,49
q 	01,24	03 	0,41
y 	00,95	03 	0,32
f 	00,59	02 	0,30
j 	00,45	02 	0,23
z 	00,39	02 	0,20
ñ 	00,24	02 	0,12
x 	00,09	02 	0,05
k 	00,00	02 	0,00
w 	00,00	02 	0,00

Obsérvese que se distinguen perfectamente las tres zonas de las que antes hablábamos, aunque las letras involucradas son diferentes por usar otra fuente de frecuencias lingüísticas:

a) Frecuencias esperables de pares en el cifrado mayores que 0.69, desde la A a la T.
b) Frecuencias en torno a 0.69 (lo que sería el comportamiento homofónico), entre la E y la M
c) Frecuencias menores que 0.69, desde la P hasta la W

La otra vía de ataque es la de encontrar la frecuencia de dígrafos, trígrafos, etc. Combinando esta información con la frecuencia de los pares individuales, podríamos detectar las agrupaciones

DE EN EL LA QU LOS LAS DEL QUE QUI, etc.

Nada, chicos, que está chupao.

Lo malo es que yo ando escaso de tiempo de máquina estos días. Pero seguro que alguno de vosotros lo destripa.

Hasta pronto.

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.