25.000 puntos en juego <u>y una camiseta kriptopolera</u>. Para LlamameX, 12.500 por plantearlo.
Os presento una nueva propuesta de algoritmo de cifrado. Se trata de Mimic, un procedimiento que intenta adaptarse al texto que se está cifrando a fin de dificultar el ataque. De nuevo lo que os presento es una prueba de concepto, que obviamente puede desarrollarse más a partir de la idea básica. Al final, incluyo un reto...
El Método
Para determinar la potencia del mecanismo se mantiene simple el cifrado en si, buscando que la dificultad de ataque provenga de la adaptación del algoritmo. La función de cifra será un XOR contra un carácter del alfabeto desordenado que se ira repitiendo (tipo Vignere pero con XOR).
La adaptación intentará impedir que se generen las secuencias repetidas características de este tipo de codificación. Para ello se generará una nueva desordenación del alfabeto cada vez que se detecte que se cifra un carácter ya cifrado anteriormente. De este modo se elimina cualquier patrón inherente al proceso ya que se crea una fuerte dependencia del mensaje.
Como puede deducirse la fortaleza proviene de la función de desorden y de lo caótica que ésta sea. La función empleada es dependiente de la clave, construyendose extrayendo letras del alfabeto a desordenar según los carácteres de ésta y repiéndose ciclicamente hasta agotar el alfabeto original. Los desórdenes posteriores del alfabeto se realizan a partir de una clave construida a partir de la inicial y de la posición del carácter en el mensaje. Así se reduce enormemente la probabilidad de repetir un alfabeto.
Tenemos como ejemplo el mensaje
EN_UN_LUGAR_DE_LA_MANCHA,_DE_CUYO_NOMBRE_NO_QUIERO_ACORDARME,_NO_HA_MUCHO_TIEMPO_QUE_VIVIA_UN_HIDALGO_DE_LOS_DE_LANZA_EN_ASTILLERO,_ADARGA_ANTIGUA,_ROCIN_FLACO_Y_GALGO_CORREDOR.
con un alfabeto base
ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.@*,
usamos la clave SANCHO
Generamos el primer alfabeto.
- Para ello tomamos la primera letra de la clave "S" que corresponde a la posición 19, empezamos de cero por tanto la primera letra del nuevo alfabeto será también la "S". Eliminamos la "S" del alfabeto original.
- La segunda letra es la "A", posición 0. 19+0=19 que corresponde ahora a la "T", que añadimos y eliminamos del original.
- La "N" nos dará 13, es decir 19+13=32 que módulo 30 (hemos quitado dos carácteres) = 2, es decir "C".
- Con la "C" generamos la "F", con la "H" la "N" y con la "O" la ",".
- Dado que llegamos al final de la clave volveremos a empezar con la "S" obteniendo "X".
El resultado final será
STCFN,XYKÑZPOQHL@*IJRWMDV_AGEUB.
Empezaremos a cifrar el texto en claro haciendo XOR con este alfabeto. Nótese que no hacemos XOR con la clave, que sería más equivalente a un Vignere. De está manera garantizamos una medida de bloque mínima de la longitud del alfabeto y evitamos la detección de claves cortas o débiles por análisis del cifrado.
Asi obtenemos Ci=Ai XOR Ki hasta detectar que codificamos un Aj = Ai (j>i).
Obtendremos:
C0 = A0 XOR K0 = "E" XOR "S" = 4 XOR 19 = 23 = "W" C1 = A1 XOR K1 = "N" XOR "T" = 13 XOR 20 = 25 = "Y" C2 = A2 XOR K2 = "_" XOR "C" = 27 XOR 2 = 25 = "Y" C3 = A3 XOR K3 = "U" XOR "F" = 21 XOR 5 = 16 = "P" C4 = A4 XOR K4 = "N" XOR "N" = 13 XOR 13 = 0 = "A"
En este punto detectamos que acabamos de codificar por segunda vez una "N", por lo que antes de cifrar el siguiente carácter desordenaremos de nuevo el alfabeto (partiendo del actual). La clave que usaremos será la original añadiéndole un carácter correspondiente a la posición expresada en base 32 (longitud del alfabeto) aunque, por comodidad de codificación, con los dígitos invertidos. Es decir la clave será:
"SANCHO" + (4 base 32) = "SANCHO" + "E" = "SANCHOE"
Con la que obtendremos el nuevo alfabeto
JRC,Q.XUB*MT_FYKEÑWAPSN@VGLHOIZD
Se resetean los contadores de aparición de la Ai y se continua el cifrado. El mensaje anterior quedará como:
WYYPAHSAH**OQJNNW.FSUDP@BNWNSEUO@WOPQWDN_,XIV.CIDOG_OEDIVARUXXHGZSCMZ.DZÑGGFQ_DUSZZTVN_CM,W,SMRBXQJN_DMTTQVAEZCT*MQ,PÑIH_**QIRKAQA@DVKRXY_ZÑFUPYZ..VX@WS.B@VHTP_PMESHG,GMETL_ZWTV
Las virtudes del cifrado son su alta entropía (prácticamente máxima: 4.99 sobre 5.00) y su aparente aleatoriedad (pasa el test Longrun de la batería FIPS) ya que en un texto de más de 27.000 carácteres en castellano la desviación típica no supera el 0.6%. En ese mismo test las cadenas más largas repetidas han sido de 5 carácteres y no correspondían al mismo texto claro, con lo que parece muy robusto frente a ataques de base estadística.
Como defectos parece poco indicado para un uso manual dada la frecuencia de las operaciones de desorden del alfabeto. Puede simplificarse este proceso sustituyendo las desordenaciones posteriores por rotaciones, cosa que lo haría más asequible para un uso no mecanizado, pero aumentaría mucho la posibilidad de generar secuencias al repetirse alfabetos.
Como ya se ha dicho la función de cifrado ha querido mantenerse simple, aunque fácilmente puede mejorarse, por ejemplo usando alfabetos distintos para calcular las posiciones de cada elemento del XOR.
Reto
A fin de poner a prueba la fortaleza del algoritmo se ha cifrado un texto de unos 35.000 caracteres que puede obtenerse de
Igualmente puede accederse a una implementación online Aquí
Ya lo voy entendiendo
sqrmatrix13 Septiembre 2011 - 1:15pm
He consultado el código fuente del JavaScript para entender el criptosistema, y creo que ya lo entiendo... ¡es aún más diabólico de lo que pensaba!.
Disculpa
Agustín12 Septiembre 2011 - 6:45pm
He avanzado algo. Ya consigo cifrar bien hasta el 12º carácter, que es cuando aparece una repetición del separador "_" desde el anterior reseteo del contador. En ese momento tengo bien el alfabeto desordenado, que es JRC,Q.XUB*MT_FYKEÑWAPSN@VGLHOIZD
Aplico el procedimiento para modificar la clave. El carácter "_" ocupa la posición 12 en el alfabeto desordenado (empezando por 0). Si buscamos en el alfabeto base el carácter doceavo, nos aparece la "M", con los que la nueva clave para desordenar debería ser "SANCHOM". Pero tu programa obtiene "SANCHOL", y a partir de ahí los dos cifrados divergen.
¡Oh, que zozobra la mía! Si no consigo cifrar ¿cómo voy a intentar siguiera descifrar?
Ahi no se usa la posición en el alfabeto sino en el mensaje
LlamameX12 Septiembre 2011 - 8:06pm
Y la posición de ese carácter "_" es la 11, por lo que le corresponde la "L" en el alfabeto ordenado.
La idea es evitar repeticiones con lo que la posición del carácter en el mensaje (base 32 y con los dígitos invertidos) concatenada a la clave será siempre única.
Añadimos Mimic-camiseta
admin11 Septiembre 2011 - 1:25pm
La resolución exitosa de Mimic se premiará además con nuestra exclusiva camiseta, que identifica en todo el país al selecto grupo de elegidos que han mostrado una excelente pericia criptoanalítica ;)
Ole!
LlamameX12 Septiembre 2011 - 10:44pm
Gracias por considerarlo digno de camiseta.
Otra estúpida pregunta
Agustín11 Septiembre 2011 - 1:13pm
Aun a riesgo de parecer tonto l'haba, me gustaría que me aclararas algo
En la generación del alfabeto desordenado tengo claro los tres primeros pasos:
1. La clave S genera la letra S (que se borra)
2. La letra A genera la letra T (que se borra)
3. La letra N genera la letra C (que se borra)
Pero luego dices, sin detallar el cálculo, que la letra clave C genera la letra F. Pero la letra clave C ya no está en el alfabeto base ¿qué posición le adjudicas? ¿la que tiene en el alfabeto desordenado?
**********************
En otro orden de cosas creo que, en efecto, Cryptool detecta de alguna forma la longitud de la clave que no es otra que la del alfabeto, 32, aunque se equivoca y dice que es el doble, 64. Los picos de la autocorrelación son nítidos cada 32 caracteres, y kasiski también obtiene una pobre coincidencia con ese valor. Y eso me extraña, dada la forma en que la clave -el alfabeto- se renueva constantemente. No creo, sin embargo, que de ahí se derive ninguna vulnerabilidad.
Para la posición uso el alfabeto base entero
LlamameX11 Septiembre 2011 - 10:12pm
Para calcular la posición de la C aún uso el alfabeto base entero, pero ya no es un carácter elegible para el alfabeto desordenado puesto que ya lo hemos cogido.
En cierto modo son C's distintas. La C de la clave sanCho se usa para calcular la distancia de la cuarta (y las correspondientes a las siguientes vueltas) letra del nuevo alfabeto.
Veo que aunque intento explicarlo sin liarme me queda oscuro. A ver con un ejemplo más gráfico
Vale
Agustín11 Septiembre 2011 - 10:19pm
Creo que ahora lo he entendido. Donde estaba oscuro era en la explicación inicial. Me pregunto si los otros, tan calladitos ellos, lo habían entendido. Chapeau para ellos, en ese caso.
Tengo que preguntar
Agustín9 Septiembre 2011 - 12:20pm
Como sólo entiendo los algoritmos que implemento, voy a dejar de dar vueltas alrededor del cifrado, y a tratar de meterme en los intríngulis del mismo. Pero entonces me doy cuenta de que no he entendido una mierda, de manera que tengo que molestarte con preguntas idiotas. Me da igual que contestes tú o cualquiera de los compañeros que SÍ lo hayan entendido. Oye, y si lo que pregunto es una estupidez, pues haces como los profes con los alumnos burros: "Vuélvetelo a leer, Agustinito, que no te has fijado bien"
Por ejemplo, cuando ya tienes, a partir de la clave "SANCHO" y el alfabeto base, el primer alfabeto desordenado:
entonces te pones a cifrar y nos econtramos con la primera letra del texto, que es la "E". La primera letra del alfabeto -que es la nueva clave- es la "S", hasta ahí, todo bien.
Y dices
Pero resulta que las posiciones de la "E" (4) y la de la "S" (19), así como la de la resultante, "W" (23) están referidas al alfabeto base. ¿Estoy en lo cierto? ¿Es siempre así? Es decir, la clave, que es un alfabeto desordenado, va cambiando, pero el alfabeto base de referencia para las posiciones es siempre el mismo ¿no? Y en caso afirmativo ¿no sería el cifrado aún más cruel si se utilizaran las posiciones en el alfabeto desordenado cambiante?
Mis disculpas y agradecimiento anticipados.
*********
EDICIÓN
*********
Evidentemente, no quise decir que se tomaran las posiciones de la clave, que es el propio alfabeto, lo que nos daría secuencialmente 0, 1, 2, 3... etc; pero sí las del texto en claro y quizá las del carácter cifrado. Bueno, es sólo una idea.
Si claro que sería más duro
LlamameX9 Septiembre 2011 - 4:40pm
Puesto que ahora por cada carácter del cifrado sólo hay 32 parejas conocidas de valores que nos lo proporcionen. Como indicaba como posible mejora, con tan sólo desordenar uno cualquiera de los alfabetos implicados en el XOR ya eliminamos también esto, pero como ya decía el cifrado en sí lo he mantenido simple adrede para dejar que sea sólo el proceso adaptativo el que proporcione fuerza al cifrado.
La longitud de la clave (again)
Agustín9 Septiembre 2011 - 3:47am
Aun a riesgo de hacer el ridículo, he realizado un kasiski patatero en el que no hay muchas coincidencias. Una de ellas, que aparece tan solo 6 veces en las distancias de 3-gramas y 4-gramas, es 2^5 = 32, que estaría próximo a los picos de la autocorrelación. Otro candidato, igual de frecuente es 2^4*3 = 48, que ya se alejaría de lo esperado.
Si yo tuviera una vía de ataque basada en la longitud de la clave -que no es mi caso- probaría con una longitud de 32 caracteres.
Claro que, por otra parte, el numerito coincide con la longitud del alfabeto, que podría ser la causa de los picos en la autocorrelación. Sería una coincidencia, aunque no es imposible, que el alfabeto y la clave tuvieran la misma longitud
No quiero aguar la fiesta
LlamameX9 Septiembre 2011 - 9:03am
Pero el algoritmo está pensado precisamente para resistir este tipo de análisis. El tamaño de bloque usado con cada alfabeto no se mantiene constante (depende de la frecuencia de repetición de los carácteres en el texto claro) y la longtud de la clave, aunque es un parámetro muy relevante, no tiene incidencia directa en las repeticiones de cadenas o en la distancia entre ellas.
Estoy de acuerdo
Agustín9 Septiembre 2011 - 10:48am
Estoy de acuerdo en lo que dices. Un algoritmo que se precie ha de estar por encima de esos banales ataques. Yo lo he intentado básicamente porque no veo por dónde hincarle el diente.
Quizá no lo haya entendido bien...
sqrmatrix8 Septiembre 2011 - 11:27pm
...y lo que diga esté equivocado.
Entiendo que cada vez que se reordena el alfabeto, se añade una letra a la clave. Y también entiendo que se desordena el alfabeto partiendo de la primera letra de la clave, y cada una de estas letras se corresponde con otra del alfabeto desordenado. Lo que veo, y que no sé si es porque lo he entendido mal, es que cuando la clave supere la longitud del alfabeto (en este caso 32), los siguientes alfabetos desordenados van a ser todos iguales, ya que el exceso de letras no se va a alcanzar en el proceso de desordenación. Este tamaño, además, se alcanzará en breve, tanto más pronto cuanto más larga sea la clave, pues necesita añadírsele menos letras para superar el tamaño del alfabeto. Además, la frecuencia de repetición de letras, que provoca un nuevo reordenamiento del alfabeto, es relativamente alta.
Así, si lo que he dicho no está equivocado, podemos suponer que a partir de una posición razonable, el alfabeto desordenado es siempre el mismo, aunque por cada letra del texto se le quita una letra al alfabeto hasta que se repita, lo que hace que diferentes secuencias de letras del texto claro seguramente sean "xoreadas" con diferentes letras del alfabeto.
Como la frecuencia de repetición de letras es relativamente elevada, existirán bastantes letras (sueltas) encriptadas con el alfabeto desordenado completo.
Si lo que he dicho no está equivocado, quizá tengamos una línea de ataque intentando atacar este cifrario suponiendo un mismo alfabeto, a partir de una posición razonable del criptograma.
=======================================================
Rectificación: Resulta que sí estaba equivocado, porque pensaba que el alfabeto que se desordenaba era el primero de todos (es decir, el ordenado), y en realidad se desordena el último. Así que lo que he dicho está equivocado. Perdonad esta equivocación.
Aún así, sigo pensando que a la clave se le añade un carácter cada vez que se desordena el alfabeto (=cuando se repite una letra del texto claro). Cuando llega a tener la longitud del alfabeto, las siguientes letras que se añadan no modifican la forma de desordenar los alfabetos, ya que se hacen con los primeros caracteres de la clave hasta completar la longitud del alfabeto. Puede que en esto también esté equivocado, aunque no lo sé.
Hay otra cosa también
LlamameX9 Septiembre 2011 - 9:11am
Igual no debería decir esto, pero el orden de los dígitos base 32 está invertido, de manera que se añade siempre primero el menos significativo con lo que las claves, aunque crezcan serán bastante distintas.
Si es cierto que a partir de algún momento existirá la posibilidad de repetir
un alfabetouna clave aunque la probabilidad será muy baja (deben repetirse todos los dígitos menos significativos) y requerirá una cantidad de texto enorme (No se añade un carácter más por cada desordenación, se añade una representación en base 32 -usando las letras del alfabeto base como dígitos- de la posición, con lo que para los 35.000 del reto es sucifiente con log32(35.000)= 3,01, és decir 4 carácteres extra)No hay que olvidar la
anv8 Septiembre 2011 - 11:50am
No hay que olvidar la moraleja que nos dejó la historia de la máquina enigma. Era prácticamente perfecta para la tecnología de la época. Pero su punto débil fueron los usuarios.
En el caso de "mimic" y otros cifrados de este tipo y conociendo el algoritmo, tal vez sea más fácil atacar a la clave misma, porque al ser elegida por una persona será seguramente una palabra del diccionario o una frase conocida. Al intentar descifrar por fuerza bruta debería encontrarse las primeras letras de la primera palabra, hasta la primera letra repetida. Los cambios de alfabeto podrían dar más pistas sobre la clave si es larga.
Longitud de la clave
Agustín8 Septiembre 2011 - 1:48am
Salvo error por mi parte, la clave mide 35 caracteres, o un valor próximo a éste. Estoy en ello.
Curioso
LlamameX8 Septiembre 2011 - 1:57pm
No digo ni que si ni que no, pero me llama la atención que tan rápidamente des una longitud de clave. ¿en qué te basas si no es indiscreción?. Creo que es bastante difícil deducirla del propio cifrado por las técnicas habituales (índice de coincidencia, kasinski, etc.) puesto que la clave tal cual sólo se usa para generar el primer alfabeto.
Es más, si no existiera el desorden posterior el tamaño de bloque ya os lo habría dado yo: 32, la longitud del alfabeto.
Pues verás
Agustín8 Septiembre 2011 - 7:26pm
Aunque me dé vergüenza decirlo, he utilizado el condenado Cryptool, tratando el cifrado como si fuera un vigènere, sabiendo que iba a fracasar, pero intentando ver la autocorrelación. En efecto, aunque Cryptool propone una longitud de 64, se ven unos picos, rutilantes, muy claros, con una separación aproximada de 35 caracteres. Como no sé qué diablos hace el programa, ahora me toca hacer una especie de kasiski casero para ver si obtengo un numerito parecido a ése, pero aún no he tenido tiempo. Es decir, se trata de una pedrada en el estanque, pero cuando no se sabe por dónde empezar, cualquier cosa es buena.
Pero ahora, con tu comentario, a lo mejor lo que he detectado es el tamaño del alfabeto, o sea, 32. Mis disculpas.
¡Pero no te disculpes!
LlamameX9 Septiembre 2011 - 4:45pm
¡Faltaría más! Bastante contento estoy con que os llame y le presteis atención.
El intento es de lo más correcto. De hecho otros cifrados míos han caído a partir de información obtenida por variaciones de los métodos clásicos de análisis que (torpe de mi) consideraba inaplicables, así que nada de eso.
De hecho lo que temía es que de nuevo hubiérais encontrado una vía de ataque rápido y me volvíerais a sacar los colores.
Me gusta
TheNexus7 Septiembre 2011 - 11:22pm
Admin, una pregunta, porque no implementamos todo esto en la Kriptopedia, por ejemplo páginas que hablen de estos sistemas cómo para dummies, aunque estos cifrados estén hechos para retos, convendría tener estas explicaciones para que la gente entienda más de criptografía y al final del artículo poner (en el caso de que sea mimic o cualquier reto con una implementación online) un enlace al emulador online.
Salu2
TheNexus
Replanteando wiki
admin8 Septiembre 2011 - 9:08am
Bueno, parece que el wiki en su concepción actual no acaba de despegar y, en cambio, hay gente que propone reutilizarlo para otras cosas distintas del objetivo inicial que planteábamos (y supongo que también a trabajar en ellas).
Una posibilidad es dejarlo abierto a quien quiera editar lo que sea, aunque eso puede llevar al caos. Además la edición del wiki no es precisamente intuitiva. Los más avezados tienden a utilizar códigos HTML, que a veces funcionan y otras... En todo caso, si se deja abierto sería imprescindible contar con algun@s que conozcan el asunto y estén dispuestos a ejercer ciertas funciones de administración y control.
Por mi parte estoy abierto a lo que sea con tal de dotar esa herramienta de alguna utilidad.
En fin, vosotros me diréis.
Timba
tokamak7 Septiembre 2011 - 11:04pm
Hombre, ahora que iba a por el cambio de alfabetos en TFTR. Bueno lo dejaré en barbecho una temporada, porque me da en la nariz que ni TFTR 1.0, 1.1 ni 2.0 se van a romper, ni tampoco MIMIC. Por cierto lo de cambiar el alfabeto cuando detectemos que se ha cifrado un caracter repetido parece una buena idea, y digo parece, porque ENIGMA tenía un serie de contactos eléctricos, que se llamaban 'reflector', si mal no recuerdo, que impedía que una letra se codificase como ella misma, lo que también parecía una buena idea, pero resultó ser una vulnerabilidad del sistema que facilitaba mucho el criptoanálisis, así que nunca se sabe.
Si fuesemos ingleses nos jugaríamos unos buenos dineros apostando por los cifrados de cada cual, pero ¿por qué no jugarse los puntos de cada uno, que se transferirían al ganador? así le daríamos más emoción a la cosa, no sé que opina el crupier, digo admin...
Por los análisis que le he hecho
LlamameX8 Septiembre 2011 - 12:07am
parece que funciona bien, aunque aquí ya me estoy acostumbrando a recoger los cachos de mis engendros por los suelos. Soy como el Doctor Infierno enviando monstruos mecánicos a Mazinger Z (uy, que se nota la edad).
Ah, y en la parte de reconocimientos me he pillado tu idea del XOR en lugar de trabajar en módulo. Creo que complica significativamente la aritmética y es más rápido de calcular.
¿Jugarme los cuartos, digo los puntos, contra TFTR?... En el mejor de los casos creo que acabaría en empate.
Un inconveniente
admin7 Septiembre 2011 - 6:43pm
Las siglas del algoritmo (CAM: Caja de Ahorros del Mediterráneo) no auguran nada bueno ;)
Buena idea
Agustín7 Septiembre 2011 - 6:34pm
Parece una buena idea, que retoma algo del monstruoso Llamame36B. Llegas en buen momento, ahora que DES parece estar en horas bajas.
Uf, ni de lejos aspiro a tanto
LlamameX8 Septiembre 2011 - 12:10am
pero lo que si que habrá que hacer algún día es pasar a tratar contenido binario con estos algoritmos y así poder empezar a usarlos para cifrar ficheros o flujos.
Me quito el sombrero
usrdxt7 Septiembre 2011 - 6:25pm
con tu imaginación y dejo para el resto que te machaquen el reto xD
Lo único, no sé si le pasa a alguien más, es que la implementación online no me funciona, no me deja hacer nada con ella.
No funciona
AgustínB7 Septiembre 2011 - 9:17pm
Pues sí parece que no funciona da un error 404 de página no encontrada.
No encuentra ni
http://llamamex.zobyhost.com/Mimic/mimc.js
ni
http://llamamex.zobyhost.com/Mimic/mimc.zip, con lo que no se puede ni bajar y ejecutar en local.
Cuando lo lea y se conecte a su proveedor lo podrá arreglar.
Aunque yo me atrevo a sujerir que ya que tenemos ahora la wiki se podría crear un apartado de Retos Online donde colgar estas páginas. Son tan sencillas y pequeñas que no creo que sea ningún problema.
Siempre y claro que ambos editor y responsable de la web estéis de acuerdo y evidentemente se abra esa sección a todo el mundo, no sólo usuarios registrados para edición.
Ya esta resuelto
LlamameX7 Septiembre 2011 - 11:59pm
Era un tema de mayúsculas en los nombres de ficheros.
No es eso, no es eso
admin7 Septiembre 2011 - 9:20pm
El wiki está, al menos de momento, para otra cosa. Pero bueno, todo es posible. También pueden colgarse los ficheros de propio web o lo que sea.