viernes, 17 de julio de 2015

Criptografía XIII: la máquina Enigma (XII)

Como decía en el anterior, en este penúltimo post sobre el criptoanális de la máquina Enigma me propongo explicar brevemente cuál fue la aportación de Gordon Welchman al diseño de la bomba ideada por Turing, para aumentar su eficacia de cara a obtener parte de la clave del día con la que los alemanes cifraban los mensajes, y poner un ejemplo de cómo se configuraba y de su funcionamiento.

Para ello retomo el ejemplo del post anterior, en el que con el texto cifrado y la "crib" utilizada obteníamos el siguiente "menú" para configurar la bomba (selecciono parte del grafo, hasta un máximo de 12 enlaces o "links" entre caracteres para completar una de las baterías de codificadores de doble extremo. De esta forma el operador, utilizando las 3 baterías disponibles, podía probar hasta 3 órdenes diferentes de los tambores - rotores - para ese "menú"):
Pero antes que nada vemos, si lo he entendido bien, la lógica empleada en la búsqueda.

Para ello consideremos el tablero de conexiones que en el proceso de cifrado intercambiaba letras de la máquina Enigma, es decir, como sabemos, las permutaciones o transformaciones que una letra pulsada en el teclado sufre hasta que se obtiene el correspondiente carácter cifrado son las siguientes:

- La del tablero de conexiones (si la letra que se pulsa no está conectada a ningún carácter del tablero ésta no sufre ninguna transformación y entonces diremos que está "autoconectada").
- La de cada uno de los rotores en el "camino" de ida hacia el reflector.
- La del reflector.
- La de cada uno de los rotores en el "camino" de vuelta desde el reflector.
- La del tablero de conexiones (caso de que la letra resultado esté conectada a otro carácter en el tablero).

Supongamos ahora que establecemos la hipótesis de que "T" está conectada con "A" en el tablero de conexiones; entonces "A", conforme a nuestro "menú", sería la entrada en la posición relativa 12, lo que daría como resultado en esa posición una letra (a la que llamaremos S1) que tiene que estar conectada en dicho tablero a "R".

Siguiendo con este razonamiento, "S1" sería la entrada en la posición relativa 1, lo que daría como resultado en esa posición una letra (S2) que tiene que estar conectada a "W"; "S2" sería la entrada en la posición relativa 5, lo que daría como resultado en esa posición una letra (S3) que tiene que estar conectada a "E"; "S3" sería la entrada en la posición relativa 16, lo que daría como resultado en esa posición una letra (S4) que tiene que estar conectada a "T".

De esta forma hemos completado uno de los bucles y lo podemos representar gráficamente como:
Lo que impone una condición para desechar o no nuestra hipótesis (que es que "T" está conectada a "A"), ya que si S4 es distinta de "A" esto implicaría que "T" debería estar conectada tanto a "A" como a S4, lo que no es posible con el diseño de la máquina y nuestra hipótesis se revelaría como falsa. Es decir, sólo si S4 es igual a "A" nuestra hipótesis de partida puede ser verdadera. Básicamente, ésta es la lógica empleada en la bomba de Turing.

Para que este sistema sea eficaz lo ideal es que el "menú" contenga cuantos más bucles mejor, ya que las condiciones impuestas sólo serán satisfechas por un número pequeño de órdenes de los rotores y posiciones de los mismos, y que haya una letra compartida por el mayor número de ellos posible ("letra central" en la terminología que ellos acuñaron; en nuestro ejemplo "T") y que será la que en la hipótesis de partida consideraremos que está conectada a otra letra en el tablero de clavijas, y en sucesivas pruebas (retroalimentación) a otras.

A partir de este concepto de la utilización de bucles en el "menú", Turing se dio cuenta de que era posible implementar esto mediante circuitos eléctricos, y así ir probando de forma automatizada, para cada uno de los posibles órdenes de los rotores, esas condiciones impuestas por el "menú", hasta obtener la posición de los mismos y los caracteres con los que se intercambiaban las letras del "menú" en el tablero de conexiones que permitían que la "crib" pudiera cifrarse como esa parte del texto cifrado y a la inversa, es decir, esa parte del texto cifrado descifrarse como la "crib". Éste el principio de la implementación de la máquina electromecánica conocida como bomba de Turing.

Después de esta breve explicación continuemos con la configuración de la bomba. En primer lugar asignemos a cada una de los enlaces entre caracteres de nuestro "menú" un codificador de doble extremo de la batería situada en la parte superior (del 1 al 12 - del primer conjunto de tres tambores de la izquierda hasta el duodécimo situado más a la derecha). Para ello, la idea consistía en seleccionar del "menú" el "camino" más largo posible a través de sus enlaces con objeto de conectar en secuencia el máximo número posible de codificadores, ya que de esta forma se simplificarían las conexiones a realizar en el panel posterior (que veremos más adelante). En nuestro ejemplo elegimos el siguiente "camino":

"S" --13-> "K" --3-> "T" --4-> "S" --11-> "E" --16-> "T" --12-> "R" --1-> "W" --5-> "E" --2-> "J"

Con lo que nuestro "menú" podría representarse gráficamente de la siguiente manera:
Ahora establezcamos la posición inicial de cada uno de los tambores conforme a la posición relativa que ocupa cada uno de los enlaces en la "crib". Para ello asumimos que el ajuste de los anillos antes de cifrarse la primera letra de la "crib" es "ZZZ", por lo que en la posición relativa 1 habrá que ajustar la posición inicial de los tambores a "ZZA", en la posición relativa 2 a "ZZB", en la 3 a "ZZC" y así sucesivamente. Es decir:

"S" --ZZM-> "K" --ZZC-> "T" --ZZD-> "S" --ZZK-> "E" --ZZP-> "T" --ZZL-> "R" --ZZA-> "W" --ZZE-> "E" --ZZB-> "J"

Con los ajustes de los tres tambores de cada uno de los codificadores, nuestro "menú" podría representarse gráficamente como sigue:
Pero, antes de continuar con el ejemplo de la configuración de la bomba y de su funcionamiento, creo que es importante explicar ahora la genial aportación de Gordon Welchman a su diseño: el tablero diagonal, que dio solución al "escaneo simultáneo" que estaba buscando Turing para evitar que los "menús" tuvieran que tener múltiples bucles.

La idea se basaba en explotar el hecho de que si se conectaba una letra con otra en el tablero de conexiones de la máquina Enigma esto implicaba, evidentemente, que la segunda estuviera conectada con la primera. ¿Sencillo, no?, pero ¿cómo implementarlo?. Nada fácil, al menos para mí, pero intento explicarlo brevemente conforme a lo que he entendido.

En la bomba todas las conexiones tenían 26 contactos (uno por cada letra del alfabeto) y, en consecuencia, los cables que se utilizaban disponían también de 26 hilos.

Dicho lo anterior, el tablero diagonal consistía en una serie de contactos eléctricos dispuestos en forma de tabla (26 x 26) en la que las filas representaban las 26 letras del alfabeto que podían aparecer en un "menú" (en mayúsculas en la siguiente figura) y las columnas las 26 letras de las posibles conexiones de las primeras en el tablero de clavijas (en minúsculas):
Por tanto, esto se implementaba mediante 26 cables (uno por cada fila) de 26 hilos (uno por cada columna de cada fila). En la figura anterior he intentado representar parte del cableado del tablero diagonal (para verlo de la forma más comprensible posible sólo están representadas las conexiones de las dos primeras filas, es decir, de los cables "A" y "B").

Las conexiones se establecían de la siguiente manera:

- Hilo "b" cable "A" con hilo "a" cable "B"; hilo "c" cable "A" con hilo "a" cable "C"; hilo "d" cable "A" con hilo "a" cable "D", ...; hilo "z" cable "A" con hilo "a" cable "Z".
- Hilo "c" cable "B" con hilo "b" cable "C"; hilo "d" cable "B" con hilo "b" cable "D"; hilo "e" cable "B" con hilo "b" cable "E", ...; hilo "z" cable "B" con hilo "b" cable "Z".
...

Es decir, en el tablero diagonal había un total de 325 conexiones cableadas de forma permanente.

En resumen: su efecto consistía, a través de la alimentación adicional que producía en los codificadores de doble extremo, en posibilitar la utilización de "menús" más sencillos (más cortos y con pocos bucles) y, al mismo tiempo, aumentar de forma considerable el número de configuraciones de la máquina Enigma que podían ser rechazadas por incorrectas sin afectar a aquellas que podían ser correctas.

La segunda versión de la bomba, equipada con el tablero diagonal, fue llamada "Agnus Dei", más conocida como "Agnes", y entró en funcionamiento en agosto de 1940.

Ahora sí, continuando con el ejemplo de la configuración de la bomba y de su funcionamiento, lo primero que tenía que hacer el operador para configurar la bomba era montar los tambores correspondientes y ajustar la posición inicial de cada uno de ellos. Supongamos que vamos a realizar la prueba de nuestro "menú" de ejemplo en la batería superior de codificadores para el orden de los tambores I-II-III. Para ello, se montarían sobre sus ejes los 3 tambores correspondientes a ese orden en cada uno de los 12 codificadores y se ajustaría cada uno de ellos a la posición inicial indicada anteriormente, de la siguiente manera:
Después, el operador establecía las conexiones del "menú" en el panel posterior, pero antes de contar cómo se realizaban esas conexiones es necesaria una breve explicación de los componentes principales de dicho panel. En la siguiente figura represento sus componentes principales:
Como ya he comentado, cada uno de estos conectores tenía 26 contactos o "pins" (uno por cada letra del alfabeto).

En la columna de la derecha de cada grupo de una batería, de arriba a abajo, un conector se correspondía con la entrada de un codificador, el siguiente con la salida de ese mimo codificador, el siguiente con la entrada del siguiente codificador, el siguiente con la salida de ese mismo codificador, y así sucesivamente hasta completar los 12 codificadores de la batería. Es decir:

- En la columna derecha del primer grupo (para la batería superior de codificadores en el frontal de la máquina) y de arriba a abajo: entrada codificador 1, salida codificador 1, entrada codificador 2, salida codificador 2,..., entrada codificador 12, salida codificador 12.

- En la columna derecha del segundo grupo (para la batería central de codificadores en el frontal de la máquina) y de arriba a abajo: entrada codificador 13, salida codificador 13, entrada codificador 14, salida codificador 14,..., entrada codificador 24, salida codificador 24.

- En la columna derecha del tercer grupo (para la batería inferior de codificadores en el frontal de la máquina) y de arriba a abajo: entrada codificador 25, salida codificador 25, entrada codificador 26, salida codificador 26,..., entrada codificador 36, salida codificador 36.

Estos conectores podían "puentearse", la salida de uno de ellos con la entrada del siguiente, para conectar codificadores en secuencia sin necesidad de utilizar cables.

Volviendo a  nuestro ejemplo, teniendo en cuenta el "camino" que hemos elegido más arriba, para establecer las conexiones del "menú" conectamos en secuencia (cuando una misma letra es la salida de un codificador y la entrada del siguiente) los siguientes codificadores:
Para ello, el operador "puentearía" la salida del codificador 1 con la entrada del codificador 2, la salida del 2 con la entrada del 3,..., y la salida del 8 con la entrada del 9, de la siguiente manera:
Ahora el operador realizaría el resto de conexiones del "menú" mediante cables de 26 hilos (uno por cada letra del alfabeto).

La columna de la izquierda contiene un conector por cada posible letra del "menú" (conectores tablero diagonal: uno por cada letra del alfabeto) y la columna central grupos de conectores interconectados entre sí (aquellos etiquetados con el mismo número) para posibilitar la conexión de una letra del "menú" a diferentes conectores de la bomba.

En nuestro ejemplo las conexiones a realizar conforme al "menú" se pueden representar de la siguiente forma (se indican entre paréntesis las conexiones en secuencia de codificadores y en color rojo las conexiones ya realizadas mediante "puentes"):
Veamos ahora dos ejemplos de conexiones a establecer:

- El conector correspondiente a la letra "S" debe conectarse a la entrada del codificador 1 y a la salida del codificador 3. Al tener que conectarse a más de un conector necesitamos utilizar conectores interconectados entre sí de la columna central.

De esta forma el conector de la "S" se conectaría mediante un cable a un conector de la columna central etiquetado con un número (por ejemplo "1"), otro de los conectores de la columna central etiquetado con el mismo número (en el ejemplo "1") se conectaría mediante otro cable al conector de entrada del primer codificador (etiquetado como "1 In") y finalmente otro de los conectores de la columna central etiquetado con el mismo número (en el ejemplo "1") se conectaría mediante otro cable al conector de salida del tercer codificador (etiquetado como "3 Out").

- El conector "J" debe conectarse a la salida del codificador 9. En este caso, como sólo debe conectarse a un conector, lo conectaríamos directamente mediante un cable a la salida del noveno codificador (etiquetado como "9 Out").

Gráficamente:
Si hacemos esto con el resto de conexiones del "menú" que nos faltan de establecer, las conexiones en el panel posterior serían las siguientes:
El siguiente paso sería determinar la letra del menú a la que se le va a aplicar la tensión, en nuestro caso hemos elegido la "T" (la "letra central"), y, por tanto, el operador debía establecer la conexión correspondiente (en nuestro ejemplo utilizando el conector de la columna central etiquetado con "3" que queda libre) con el conector para aplicar dicha tensión, que también se encuentra en el panel posterior.

Y lo único que faltaría ya para tener lista la bomba es activar uno de los interruptores para la batería superior de codificadores que se encuentran en el lateral derecho (uno para cada letra del alfabeto), para probar la hipótesis de partida establecida (en nuestro ejemplo que "T" se conecta en el tablero de conexiones de la máquina Enigma con la letra correspondiente al interruptor que se accione; en nuestro caso hemos elegido "A").
Tras realizar estos pasos el operador ponía en marcha la bomba y los tambores comenzaban a girar de forma sincronizada comprobando las posiciones de los mismos que eran compatibles con las condiciones impuestas por el "menú".

Por su diseño, la bomba se paraba cuando alguno o varios de los relés se desactivaban. Como norma general, la solución que mostraba la parada podía ser correcta sólo si uno de los relés permanecía activado o sólo si uno de ellos permanecía desactivado. La letra correspondiente al relé que permanecía activado o desactivado era la candidata a estar conectada en el tablero de conexiones con la letra a la que se le había aplicado la tensión (en nuestro ejemplo "T").

Tras una parada el resultado de la misma se leía en tres tambores diseñados para ello y situados a la derecha de la batería central de codificadores en el panel frontal de la máquina. La posición de esos tres tambores revelaba una posibilidad para el ajuste de los anillos correspondiente a los rotores de la máquina Enigma: rotor lento o izquierdo, medio o central y rápido o derecho, respectivamente.

En nuestro ejemplo supongamos que dichos tambores muestran las posiciones "S-B-R" y que sólo un relé permanece activado, el correspondiente a la letra "D" (lo que indicaría que la letra "T", en nuestro ejemplo la "letra central" a la que hemos aplicado la tensión, estaría conectada en el tablero de conexiones con la letra "D"). Tras apuntar el resultado de la parada el operador volvía a poner la bomba en funcionamiento y comprobaba si esta parada podía ser la correcta en otra máquina diseñada para este fin (en inglés "checking machine") y que constaba de cuatro tambores, 26 teclas y 26 lámparas:
El tambor más a la izquierda hacía las veces de reflector (R) y el resto de tambores de los rotores de una máquina enigma, en el siguiente orden (de izquierda a derecha): lento o izquierdo (L), medio o central (M) y rápido o derecho (N).

Para ello, con los tambores correspondientes a la prueba realizada (en nuestro caso I-II-III), el operador realizaría el ajuste de los anillos de los tambores a las posiciones indicadas en la parada (en nuestro caso "S-B-R" y que se han representado en la figura anterior con un punto blanco) y después iría pulsando cada una de las letras del "menú" para obtener aquella letra a la que estaría conectada cada una de ellas en el tablero de conexiones, de la siguiente manera:

- "S": en nuestro menú "T" es la entrada del codificador 3 (con los tambores en "ZZD") y su salida es "S". Entonces el operador ajustaría los tambores de la "checking machine" a dicha posición ("ZZD") y pulsaría la letra "D" (aquella que la máquina indica que estaría conectada a "T") para obtener aquella a la que estaría conectada "S" en el tablero de conexiones. En nuestro caso supongamos que se ilumina la lámpara "C".

- "K": "S" es la entrada del codificador 1 (con los tambores en "ZZM") y su salida es "K". Entonces el operador ajustaría los tambores a dicha posición ("ZZM") y pulsaría la letra "C" (aquella que estaría conectada a "S") para obtener aquella a la que estaría conectada "K" en el tablero de conexiones. En nuestro caso supongamos que se ilumina la lámpara "Z".

Y así sucesivamente.

En resumen y en nuestro ejemplo, supongamos que en esta parada la bomba sugiere para cada una de las letras del "menú" las siguientes letras a las que estarían conectadas cada una de ellas en el tablero de clavijas:

- "S": "C".
- "K": "Z".
- "T": "D".
- "E": "P".
- "R": "Y".
- "W": "Z".
- "J": "N".
- "A": "I".
- "G": "B".
- "C": "L".

Con lo que tenemos una contradicción, ya que "Z" no puede estar conectada a la vez a "K" y "W" en el tablero de clavijas y por tanto la parada se revelaría como falsa.

Supongamos ahora que en la siguiente parada los tambores que indican los ajustes de los anillos muestran las posiciones "Q-J-F" y que sólo un relé permanece activado, el correspondiente a la letra "B" (lo que indicaría que la letra "T", en nuestro ejemplo la "letra central" a la que hemos aplicado la tensión, estaría conectada en el tablero de conexiones con la letra "B"). Tras apuntar el resultado de esta nueva parada, el operador volvería a poner la bomba en funcionamiento y comprobaría si esta parada podía ser la correcta.

Repitiendo los pasos anteriores (esta vez con el ajuste de los anillos en "Q-J-F") supongamos que el resultado es el siguiente:

- "S": "F".
- "K": "I".
- "T": "B".
- "E": "E".
- "R": "W".
- "W": "R".
- "J": "N".
- "A": "V".
- "G": "M".
- "C": "P".

En este caso no se producen contradicciones por lo que podría tratarse de la solución correcta.

Como resumen, esta parada nos ha dado con respecto a una posible solución:

- Los rotores utilizados y su orden: "I-II-III".
- El ajuste de los anillos: "Q-J-F".
- Las siguientes conexiones en el tablero de clavijas para intercambiar pares de letras: "S/F", "K/I", "T/B", "R/W", "J/N", "A/V", "G/M", "C/P" y nos indica que "E" no está conectada a otra letra en el tablero (o, lo que es lo mismo y utilizando el término que ellos acuñaron, estaría "autoconectada"), es decir, las conexiones en el tablero de clavijas de todas las letras implicadas en el "menú".

Con la información de esta parada y siguiendo el procedimiento anterior, podríamos obtener también las conexiones en el tablero de algunas de las letras del grafo no empleadas en el "menú" (ver post anterior), en nuestro ejemplo para "Z", con lo que tendríamos 9 de las 10 posibles conexiones, sabiendo además que  "E" está "autoconectada".

Esta posible solución debía ser probada en una réplica de la máquina para comprobar si era o no la correcta. En esta última prueba obtener las conexiones desconocidas en el tablero (en nuestro ejemplo sólo una) no era tarea difícil, aunque hay algún detalle de esta prueba que omito para no aburrir en exceso.

Hasta aquí este post sobre la lógica, configuración y funcionamiento de la bomba de Turing-Welchman, pero la historia no termina aquí. En el siguiente y último post de esta serie sobre la máquina Enigma contaré cómo continuó.

No hay comentarios:

Publicar un comentario