Cifrado por batido de bits

Por Agustín

Que sepáis que he desarrollado este invento contraviniendo las rigurosas consignas del personal de la clínica psiquiátrica “El Puzzle Asesino”, donde me han prohibido hasta hacer el sudoku del periódico, porque dicen que mi debilitado cerebro puede hacer un fundido en negro definitivo en cualquier momento. Tuve que garabatear el rosco en los márgenes del prospecto del Haloperidol, y después, aprovechando la visita de un sobrinito, usar su esmarfón para mandarle a Admin este documento. Por cierto, cómo se sufre con esos teclados táctiles, donde nunca sabes si has pulsado tres veces el 6 para escribir una O, o cuatro veces el 9 para que salga una Z, y lo que aparece en la pantalla es un burlón emoticono...

Ya sabéis que, en mi opinión, un reto imposible de resolver no tiene ningún interés, por lo que he preparado un artilugio relativamente simple, casi minimalista, diría yo. Como la diferencia esencial entre los cifrados modernos y los clásicos es la manipulación de bits, he preparado un ejercicio que trata de demostrar que, en efecto, los tejemanejes con estas unidades básicas de información confieren, de por sí, cierta solidez a los cifrados. Para ello me he limitado a introducir cierta entropía en la cadena de bits del texto plano, en función de la clave, renunciando a realizar ninguna operación adicional, ni siquiera un miserable XOR. El asunto consiste en ir eligiendo bits, en función de los valores de las letras de la clave, e ir colocándolos a la izquierda o a la derecha de la ristra, como sugiere la figura:

Me adelanto a presentar mis excusas, en el caso de que el artefacto ya esté inventado.

El alfabeto

Vamos a manejar un alfabeto formado por 32 símbolos, que contienen veintisiete letras (con la Ñ), más un separador, y cuatro signos de puntuación.

De manera que podemos asignar a cada símbolo un código de cinco bits:

La clave

La clave constará de un conjunto símbolos del alfabeto, de longitud ilimitada, a la que se le aplicarán los tratamientos que luego se explican.

El problema de la clave corta

Aunque soy un aficionado mindungui, no creáis que no me doy cuenta de ciertas debilidades clamorosas que tiene el bicho, aunque otras se me escaparán, seguramente. Por ejemplo, si la clave es corta, los bits movidos serán muy pocos, y la mayor parte del texto plano quedaría a la vista. Como la ley de Murphy -¡el de la cerveza no, hombre!- exige considerar al usuario como un perfecto imbécil, y tampoco podemos obligar a nadie a escribir y recordar claves kilométricas, haremos que la clave se expanda hasta medir 160 caracteres como mínimo, mediante un sencillo truco: Se irán añadiendo letras con los valores.

donde L es la longitud de la clave inicial. Es decir, si la clave introducida por el indolente usuario es “VALE”:

La V nos daría la W, la A nos daría la B, etc. La completaríamos añadiendo letras de aquesta guisa:

Parecerá una chorrada, y probablemente lo sea, pero así tenemos más probabilidad de mover muchos más bits, aunque es posible que algunos se muevan varias veces y otros ninguna, por lo que no se garantiza que no queden grupos reconocibles, hélas. Debo adelantar que luego se modificará el alfabeto, de forma que las posiciones de los símbolos añadidos, WBMF... etc., no guardarán una relación tan sencilla con los que les preceden.

Tratamiento del alfabeto

A partir de la clave se trastocará el alfabeto, vieja costumbre de discutible valor práctico, pero a la que los viejos aficionados (y más aún los aficionados viejos) no podemos sustraernos.

Las posiciones de las letras de la clave inicial nos van a indicar las letras que extraeremos del alfabeto base para incorporarlas al alfabeto modificado. Para obtener la primera letra calcularemos la suma de las posiciones de las letras de la clave, módulo 32:

De manera que la primera letra a extraer será la “J”.

A partir de ese punto obtendremos la posición de las letras a extraer mediante

es decir, vamos sumando, cíclicamente, las posiciones de las letras de la clave, haciendo módulo con la longitud del alfabeto base menguante, L-alfa.

En este caso obtendríamos el siguiente alfabeto:

Re-evaluación de la clave

Al modificar el alfabeto, la clave original, expandida, tiene ahora las siguientes posiciones:

cuya distribución pseudoaleatoria (¿oíste, viejo?) servirá para suministrar entropía a los bloques de bits.

El algoritmo de cifrado

Aparte de alguna triquiñuela para darle algo de fuerza al sistema, el algoritmo consiste básicamente en los siguientes pasos:

1. Descomponer el texto plano en bloques de 32 caracteres. Si el último bloque tiene menos de 32 caracteres, se completará con letras del alfabeto base obtenidas a partir de las posiciones de la clave expandida, mediante:

donde K(i) son las sucesivas letras de la clave.

Se añade 1, tanto a la posición de la letra clave como al valor del índice, para evitar todos los productos nulos que se darían para todas las ocurrencias del primer carácter del alfabeto derivado en la clave, y del primer carácter de la misma.

2. Convertir cada bloque en una ristra de bits, a razón de cinco bits por símbolo, según se mostró anteriormente. Eso nos da bloques de 160 bits.

3. Ir extrayendo de la ristra los bits que tengan las posiciones dadas por:

4. Colocar el bit extraído al principio (izquierda) o al final (derecha) de la ristra, según la siguiente tabla:

5. Juntar los bloques y tomar los bits de cinco en cinco para extraer las letras correspondientes del alfabeto.

La fuerza del cifrado

Según mis cuentas, si se consigue batir bien la tortilla nos encontraríamos con una ristra desordenada de 160 bits. Eso significa que un ataque de fuerza bruta debería ensayar 160! permutaciones, es decir, 4.7 * 10^284, una robustez bastante superior a la del fenecido ACYNOS. Pero lo más probable es que el desorden introducido no haya sido suficiente, y también estoy seguro de que los avezados analistas, como mellon, sqrmatrix y los demás, sabrán encontrar atajos que simplifiquen el problema, quizá atacando la falta de aleatoriedad del batido de bits.

El descifrado

El descifrado consiste en los siguientes pasos:

1. A partir de la clave, se genera el alfabeto derivado como se definió en la fase de cifrado.

2. Se expande la clave y se le asignan a sus caracteres las posiciones en el nuevo alfabeto, igual que en el cifrado.

3. Se descompone el texto cifrado en bloques de 32 caracteres.

4. Se codifica cada bloque en binario usando cinco bits por carácter.

5- Se revierte el proceso de dispersión de bits tomando la clave por el final, y aplicando las reglas establecidas en el cifrado, es decir, tomar el bit de la derecha del bloque o de la izquierda, según los valores de K(i) y de (i) (ver la tabla correspondiente).

6. Se inserta el bit en el bloque en la posición dada por

7. Al terminar de recorrer toda la clave en sentido inverso, se decodifican los bits resultantes, tomados de cinco en cinco, con lo que se obtendrán los caracteres en claro, si todo ha funcionado bien.

Un ejemplo

Imaginemos que el texto fuera:

El primer bloque de caracteres sería:

Al que le corresponde el siguiente código binario:

El batido de bits proporciona:

que corresponde a los siguientes símbolos del alfabeto:

El cifrado completo resulta ser:

Al descifrarlo obtenemos:

Obsérvese que hay unos caracteres aleatorios añadidos al final, que deben ser descartados.

El reto

Aquí tenéis un texto cifrado con la Omelette, para que podáis hincarle el diente.

El fichero completo (1585 KB) está en:

Espero que LlamameX tenga tiempo para implementar uno de sus mundialmente famosos JavaScripts, y colgarlo de la “nube” antes de que el FBI se lo impida.

Aparte de los puntos que Admin tenga a bien regalaros, yo puedo ofreceros una alcachofa de ducha escocesa, un instrumento de lavativa king size, y una cachiporra quitapenas, que he sustraído habilidosamente al personal de la clínica.

Un cordial saludo a todos.

Agustín