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

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

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

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

  1. C0 = A0 XOR K0 = "E" XOR "S" = 4 XOR 19 = 23 = "W"
  2. C1 = A1 XOR K1 = "N" XOR "T" = 13 XOR 20 = 25 = "Y"
  3. C2 = A2 XOR K2 = "_" XOR "C" = 27 XOR 2 = 25 = "Y"
  4. C3 = A3 XOR K3 = "U" XOR "F" = 21 XOR 5 = 16 = "P"
  5. 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á:

  1. "SANCHO" + (4 base 32) = "SANCHO" + "E" = "SANCHOE"

Con la que obtendremos el nuevo alfabeto

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

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

Texto del reto

Igualmente puede accederse a una implementación online Aquí