8 oct 2017

Haz tu propia máquina Enigma

La máquina Enigma es un hito criptográfico. Su llamativo diseño y la inevitable asociación con la Alemania nazi la dota de un halo legendario, que podría hacernos creer que su funcionamiento es hermético e incomprensible. Nada más lejos de la realidad: está basada en tres simples dispositivos (rotor, plugboard y reflector). Conociéndolos bien, podremos entenderla perfectamente e incluso construir nuestra propia Enigma.


La máquina Enigma, como Hitler, empezó a popularizarse dos décadas antes de su apoteosis en la 2ª Guerra Mundial. En 1918, el ingeniero eléctrico alemán Arthur Scherbius patentaba su invento para cifrar texto por medio de rotores al que decidió llamar αἴνιγμα (Enigma en griego). El mismo año, un soldado volvía a Munich tras firmarse el armisticio que sellaba la derrota de su país en la Gran Guerra. Sólo un lustro más tarde, nuestros dos protagonistas cobraban fama: la Enigma era presentada al público y la prensa en congresos internacionales, y el soldado se ganaba la simpatía de parte del pueblo alemán tras ser juzgado y encarcelado por liderar un intento de golpe de estado. La continuación de esta historia es bien conocida, así que nos centraremos en la del invento de Scherbius.

1937: la Enigma ya cifra las comunicaciones de otros ejércitos además del alemán, como el italiano y el bando franquista en la Guerra Civil española. Los británicos, aún sin Turing en plantilla, logran descifrar las comunicaciones de los dos últimos porque sus Enigmas no incorporan plugboard (la mayor fuente de complejidad de la máquina, que describiremos más tarde), pero no tienen la cortesía de compartir sus hallazgos con el bando republicano, que perdió sin conseguir resolver el enigma.


Pero ya vale de historia, es hora de explicar en qué consistía el artilugio. Tenía pinta de máquina de escribir moderna a la que se le ha intercambiado el soporte para papel por un conjunto de letras que parece un segundo teclado, sólo que no se pueden pulsar y se iluminan (mostrando la letra cifrada) cuando escribimos en el teclado verdadero. También se le han añadido un montón de agujeros en la parte delantera (éste es el famoso plugboard) y detrás del falso teclado, tres grandes ruedas dentadas con letras o números escritos en el borde (conocidas como rotores). Oculto, está el tercer elemento necesario para comprenderla: el reflector. No formaba parte del diseño original de Enigma, y fue incorporado posteriormente para simplificar enormemente su uso, ya que permitía cifrar y descifrar textos con la misma máquina, sin realizar ningún ajuste. Su función, como sugiere el nombre, era "reflejar" la corriente procedente del rotor izquierdo y hacerla retroceder como vemos en este fabuloso esquema hecho por MesserWoland:

La Enigma funciona por medio de simples circuitos eléctricos, así que sólo tienes que seguirle la corriente. Pulsas la A y la señal pasa por el rotor derecho, cuyo cableado interno la hace cambiar de dirección. En el ejemplo de arriba, vemos cómo el rotor derecho la desvía de la posición 1 (asociada a la letra A) a la 2 (asociada a la B). La corriente sufre otros dos desvíos en el rotor central y el izquierdo, y llega al reflector, que no es más que un "cuarto rotor" con dos peculiaridades: no rota (ahora explicaremos cómo lo hacen los otros) y su entrada y salida de corriente están conectados al mismo rotor, actuando como un espejo. La señal recorre el circuito de vuelta y se ilumina la G. Ésta es la letra A cifrada, y al introducir G en una Enigma con las claves adecuadas, la volveremos a descrifrar obteniendo la A original. A cambio de aportar versatilidad a la Enigma, el reflector es el culpable del gran talón de Aquiles de la máquina: es imposible que una letra se cifre como sí misma. Esta característica fue fundamental para que Turing y su equipo "descifraran" Enigma.

Esta disposición puede parecer suficientemente compleja, pero no lo es. Si la mantenemos constante, nuestro código será fácilmente descifrado mediante análisis de frecuencias. Pero afortunadamente, un vaso es un vaso y los rotores rotan. A un ritmo bastante regular, además: el derecho gira cada vez que pulsamos una tecla; el de enmedio cada 26 vueltas del derecho; y el izquierdo, cada 26 del de enmedio (26 no es un número mágico, es la cantidad de letras del alfabeto internacional y no, no puedes cifrar la ñ con una Enigma). La rotación hace que cambie el recorrido de cada letra que ciframos, como puedes observar en la parte inferior del esquema que acabamos de comentar.
Ya sólo nos queda hablar del plugboard. Se trata sencillamente de un conjunto de agujeros asociados a cada letra que se encuentran al final del circuito. Si conectas mediante un cable los agujeros A y B, cuando el resultado del cifrado sea una A, se iluminará la B y viceversa.

Observa cómo giran los rotores y se iluminan las letras delanteras en este gif de origen desconocido. Fíjate en que, a pesar de pulsar siempre la misma tecla, se van iluminando distintas letras.

A estas alturas de la entrada puedo confesar que el título era un pelín clickbait, pero no del todo. He "construido" (programado en Python) un modelo históricamente preciso de la más mítica de las Enigmas, la Enigma I, arquetipo de la máquina por ser la más utilizada por los nazis en la guerra y el objetivo principal del equipo de Alan Turing. La inmensa mayoría de simulaciones de la máquina que encontrarás por internet son de la Enigma I. Tenía la peculiaridad de poderse elegir tres de entre cinco rotores disponibles, multiplicando la potencia de la máquina (número de estados posibles) por diez. Este número sale de calcular las posibles combinaciones de sólo tres rotores (3!=6) y compararlas con las posibles combinaciones de tres rotores escogidos entre cinco (5!/2=60). El plugboard permitía hacer diez cambios, lo que multiplicada la complejidad de la máquina (debido a un cálculo combinatorio en el que no voy a entrar) por 26!/((26-20)!·2¹⁰·10!)=150 738 274 937 250
P

Por último, los estados posibles de los tres rotores son 26³=17 576. Multiplicando estos tres números, obtenemos la cantidad de estados posibles de la Enigma I.

Genial modelo gráfico para entender el funcionamiento interno de Enigma. Me ayudó mucho a entenderla. Pruébalo online aquí.

Antes de abandonaros a vuestra suerte con mi código (aunque no es justo decir esto, porque lo he llenado de comentarios para que sea más legible), quiero animaros a proseguir en el impulso que os trajo aquí: construir una Enigma vosotros mismos. Aunque puede ser frustrante a ratos, acaba siendo súper satisfactorio y, lo más importante, permite comprenderla muchísimo mejor que cualquier descripción que leáis, por muy divulgativa que sea. Si queréis orientaros, hay documentación de Enigmas programadas en Ruby, Java, Matlab,... e incluso tutoriales para reconstruir una Enigma física, de las de verdad.

Aquí tenéis mi modelo, que se basa en convertir los rotores, el plugboard y el reflector en listas, y las letras en números que tendrán un doble papel según la fase del cifrado: antes de pasar por el reflector, la letra n será cifrada por cada rotor como el n-ésimo elemento de la lista asociada a dicho rotor. Tras pasar por el reflector, operaremos al revés, cifrando la letra n como la posición del elemento con valor n en esa lista. Todo este trabalenguas se entiende mucho mejor en el propio código.
El giro de los rotores está implementado como sumar uno a la letra y hacer módulo 26 (tras un giro completo, hemos de volver al mismo sitio). La función toma como variables lo mismo que necesitaríamos para operar con una Enigma: las claves (rotores utilizados y posición inicial de los mismos, junto con los cambios del plugboard) y el texto a cifrar. La función devuelve el texto cifrado. He añadido como ejemplo un fragmento de una canción de Labordeta encriptado con otro modelo de la Enigma I. Se llama Banderas rotas y trata sobre derrotas. Evoca sentimientos agridulces: el descifrado de Enigma fue clave para romper banderas con esvásticas y habría sido de gran ayuda para derrotar a sus aliados españoles.

Nunca sabremos si, de habernos dado los británicos la clave de la Enigma franquista, estaríamos hoy cifrando esta canción.


Si no tienes Python, puedes ejecutar y jugar con esta función online en repl.it, eliminando la primera línea de código (sí, la codificación de caracteres sigue dándonos la lata en pleno 2017).





Fuentes y lectura recomendada

Las imágenes sin pie de foto las saqué en el Science Museum de Londres y en Bletchley Park, dos visitas muy recomendadas.

Esquema de los rotores por MesserWoland - Own work based on Image:Enigma-action.pnj by Jeanot; original diagram by Matt Crypto, CC BY-SA 3.0,  https://commons.wikimedia.org/w/index.php?curid=1794494



 https://elpais.com/elpais/2008/10/11/actualidad/1223713021_850215.html

 https://crypto.stackexchange.com/questions/33628/how-many-possible-enigma-machine-settings

http://www.cryptomuseum.com/crypto/enigma/i/index.htm#wheels

https://en.wikipedia.org/wiki/Enigma_rotor_details#Rotor_wiring_tables

http://enigmaco.de/enigma/enigma.html

https://en.wikipedia.org/wiki/Adolf_Hitler's_rise_to_power

https://de.wikipedia.org/wiki/Arthur_Scherbius

https://docs.python.org/2/tutorial/index.html




5 comentarios:

  1. Ohh, ¿qué es lo que no te ha gustado?

    ResponderEliminar
  2. Enhorabuena. Puedes sentirte muy muy orgulloso de tu trabajo. Es absolutamente genial. Y muchísimas gracias por compartirlo con todos.

    ResponderEliminar