Apéndice
EL ALGORITMO DE CIFRADO SOLITARIO
Por Bruce Schneier
Autor de Applied Cryptography
Presidente de Counterpane Systems
http://www.counterpane.com
En la novela de Neal Stephenson Criptonomicón, el personaje de Enoch Root describe un criptosistema llamado «Pontifex» a otro personaje llamado Randy Waterhouse, y más tarde revela que se supone que los pasos del algoritmo se ejecutan empleando un mazo de cartas. Esos dos personajes intercambian a continuación varios mensajes cifrados empleando este sistema. El sistema se llama «Solitario» (en la novela, «Pontifex» es un nombre en clave para ocultar temporalmente el hecho de que emplea un mazo de cartas) y yo lo diseñé para permitir que agentes de campo se comunicasen de forma segura sin tener que depender de dispositivos electrónicos ni llevar encima herramientas incriminatorias. Un agente podría encontrarse en una situación donde simplemente no tiene acceso a un ordenador, o podrían detenerle si tiene herramientas para la comunicación secreta. Pero un mazo de cartas… ¿qué mal podría haber?
Solitario obtiene su seguridad de la aleatoriedad inherente a un mazo de cartas barajado. Manipulando el mazo, un emisor puede crear una cadena de letras «aleatorias» que puede combinar con el mensaje. Evidentemente, Solitario puede simularse en un ordenador, pero se le ha diseñado para ser ejecutado a mano.
Solitario puede ser de baja tecnología, pero la intención es que su seguridad sea de lo más potente. Diseñé Solitario para ser seguro incluso contra los adversarios militares con mejores recursos, con los mayores ordenadores y los criptoanalistas más inteligentes. Evidentemente, nada garantiza que alguien no pueda encontrar un ataque ingenioso contra Solitario (consultar mi página web para ponerse al día), pero el algoritmo es claramente mejor que otras cifras de lápiz y papel que he visto.
Pero no es rápido. Puede llevar toda una tarde cifrar o descifrar un mensaje razonablemente largo. En el libro de David Kahn, Kahn on Codes, se describe una cifra real de lápiz y papel empleada por un espía soviético. Tanto el algoritmo soviético como Solitario requieren aproximadamente la misma cantidad de tiempo para cifrar y descifrar un mensaje.
Cifrar con Solitario
Solitario es una cifra de flujo de salida-retroalimentación. En ocasiones se le llama generador de clave (KG en la jerga militar de Estados Unidos). La idea básica es que Solitario genera una secuencia, en ocasiones llamada «secuencia de clave», de números entre 1 y 26. Para cifrar, hay que generar el mismo número de letras de la secuencia de clave como letras tiene el texto llano. Luego hay que sumar módulo 26 a las letras del texto llano, una a una, para crear el texto cifrado. Para descifrar, hay que generar la misma secuencia de clave y restar módulo 26 del texto cifrado para recuperar el texto llano.
Por ejemplo, para cifrar el primer mensaje Solitario mencionado en la novela de Stephenson, «DO NOT USE PC»:
1. Dividir el mensaje en texto llano en grupos de cinco caracteres (no hay nada mágico en los grupos de cinco caracteres; es simplemente la tradición). Se usan equis para rellenar el último grupo. Así que si el mensaje es «DO NOT USE PC» entonces el texto llano es:
DONOT USEPC
2. Usar Solitario para generar diez letras de la secuencia de clave (los detalles se dan después). Demos por supuesto que son:
KDWUP ONOWT
3. Convertir el mensaje en texto llano de letras a números: A=l, B=2, etc:
4 15 14 15 20 21 19 5 16 3
4. Convertir las letras de la secuencia de clave de forma similar:
11 4 23 21 16 15 14 15 23 20
5. Sumar los números de la serie del texto llano a los números de la secuencia de clave, módulo 26 (lo que esto significa es que si la suma es superior a 26, hay que restarle 26 al resultado). Por ejemplo, 1+1=2, 26+1=27, y 27-26=1… por tanto, 26+1=1.
15 19 11 10 10 10 7 20 13 23
6. Convertir los números en letras:
OSKJJ JGTMW
Si eres realmente bueno, puedes aprender a sumar letras de cabeza, y simplemente sumar las letras del paso (1) y (2). Sólo se precisa práctica. Es fácil recordar que A+A=B; recordar que T+Q=K es más difícil.
Descifrar con Solitario
La idea básica es que el receptor genera la misma secuencia de clave, y luego resta las letras de la secuencia de clave de las del texto cifrado.
1. Tomar el mensaje cifrado y disponerlo en grupos de cinco caracteres (ya debería tener esta forma).
OSKJJ JGTMW
2. Usar Solitario para generar diez letras de la secuencia de clave. Si el receptor emplea la misma clave que el remitente, las letras de la secuencia de clave serán las mismas:
KDWUP ONOWT
3. Pasar el mensaje cifrado de letras a números:
15 19 11 10 10 10 7 20 13 23
4. Convertir de forma similar las letras de la secuencia de clave:
11 4 23 21 16 15 14 15 23 20
5. Restar los números de la secuencia de clave de los números del texto cifrado, módulo 26. Por ejemplo, 22-1=20,1-22=5. (Es fácil. Si el primer número es menor que el segundo, añadir 26 al primer número antes de restar. Por tanto 1-22=? se convierte en 27-22=5.)
4 15 14 15 20 21 19 5 16 3
6. Convertir los números en letras:
DONOT USEPC
Descifrar es igual que cifrar, excepto que se resta la secuencia de clave del mensaje cifrado.
Generar las letras de la secuencia de clave
Aquí tenemos el núcleo de Solitario. La descripción del cifrado y descifrado sirve igual para cualquier cifra de flujo de salida-retroalimentación. Esta sección explica el funcionamiento de Solitario.
Solitario genera una secuencia de clave empleando un mazo de cartas. Puede considerar un mazo de 54 cartas (recuerde los comodines) como una permutación de 54 elementos. Hay como 54!, o unas 2,31xl071, formas posibles de ordenar el mazo. Mejor aún, hay 52 cartas en el mazo (sin los comodines) y 26 letras en el alfabeto inglés. Es una coincidencia demasiado buena para dejarla pasar.
Para su empleo en Solitario, un mazo necesita las 52 cartas y dos comodines. Los comodines deben diferir de alguna forma. (Es lo normal. El mazo que estoy usando mientras escribo este texto tiene estrellas en los comodines: uno tiene una estrella pequeña y el otro una estrella grande.) Digamos que uno es el comodín A y el otro el B. Por lo general, hay un elemento gráfico en los comodines que es igual pero de tamaño diferente. Que el comodín «B» sea el «mayor». Si es más fácil, puedes escribir una «A» y una «B» en los dos comodines, pero recuerda que luego tendrás que explicárselo a la policía secreta si te pillan.
Para inicializar el mazo, pon el mazo sobre la mano mirando hacia arriba. Luego, dispón las cartas en la configuración inicial que es la clave (hablaré de la clave más tarde, pero es diferente de la secuencia de clave). Ahora estás listo para producir la secuencia de clave.
Así es Solitario:
1. Encuentra el comodín A. Desplázalo una carta hacia abajo (es decir, intercámbialo con la carta que tenga debajo). Si el comodín se encuentra al fondo del mazo, colócalo sobre la carta superior.
2. Encuentra el comodín B. Desplázalo dos cartas hacia abajo. Si el comodín se encuentra en el fondo del mazo, desplázalo justo debajo de la segunda carta. Si el comodín está justo encima de la última carta, desplázalo justo debajo de la primera carta (básicamente, debes asumir que el mazo es un bucle completo… ya te lo imaginas).
Es importante realizar estos pasos en orden. Es tentador gandulear y limitarse a desplazar los comodines en el orden en que te los encuentras. Se puede, a menos que estén muy cerca el uno del otro.
Así que si el mazo tiene este aspecto antes del paso 1:
3 A B 8 9
al final del paso 2 debería quedar así: 3 A 8 B 9
Si tienes cualquier duda, recuerda desplazar el comodín A antes que el comodín B. Y ten cuidado cuando los comodines se encuentren al fondo del mazo.
3. Realiza un corte triple. Es decir, intercambia las cartas sobre el primer comodín con las cartas bajo el segundo comodín. Si el mazo tiene este aspecto:
2 4 6 B 4 8 7 1 A 3 9
entonces, después del corte triple quedará así:
3 9 B 4 8 7 1 A 2 4 6
«Primer» y «Segundo» comodines se refiere al comodín que esté más cerca, y más lejos, de la parte alta del mazo. Ignora la «A» y la «B» en este paso.
Recuerda que los comodines y las cartas que hay entre ellos no se mueven; las otras cartas se desplazan a su alrededor. Es fácil de hacer entre las manos. Si no hay cartas en una de las tres secciones (ya sea porque los comodines están juntos o uno en la parte alta o en la parte baja), simplemente trata esa sección como vacía y desplázala igualmente.
4. Realiza un corte contando. Mira a la carta del fondo. Conviértela en un número entre 1 y 53. (Emplea el orden de palos del bridge: tréboles, diamantes, corazones y picas. Si la carta es de ♣, entonces tiene el valor que muestra. Si la carta es de ♦, entonces es su valor más 13. Si es de ♥, es su valor más 26. Si es de ♠, es su valor más 39. Cualquiera de los comodines vale 53.) Cuenta ese número hacia abajo desde la carta más alta (yo normalmente cuento desde 1 hasta 13 una y otra vez si es preciso; es más simple que contar en secuencia hasta números altos.) Corta después de la carta hasta la que has llegado, dejando la carta del fondo abajo del todo. Si el mazo tenía este aspecto:
7 … cartas … 4 5 … cartas … 8 9
y la novena carta era el 4, el corte daría como resultado:
5 … cartas … 8 7 … cartas … 4 9
La razón por la que se deja la última carta en su lugar es para que este paso sea reversible. Es un detalle importante de cara al análisis matemático de su seguridad.
5. Busca la carta de salida. Mira en la carta en la parte alta. Conviértela en un número entre 1 y 53, de la misma forma que antes. Cuenta hacia abajo ese número de cartas (cuenta la primera carta como número uno). Apunta en una hoja de papel la carta que encontraste después de la que contaste (si te encuentras con un comodín, no escribas nada y comienza de nuevo con el paso 1). Esta es la primera carta de salida. Ten en cuenta que este paso no modifica el estado del mazo.
6. Convierte la carta en un número. Como antes, emplea los palos del bridge para ordenarlos. De más bajo a más alto tenemos tréboles, diamantes, corazones y picas. Por tanto, de A♣ hasta K♣ es de 1 a 13, de A♦ hasta K♦ es de 14 a 26, de A♥ hasta K♥ es de 1 a 13, y de A♠ hasta K♠ es de 14 a 26.
Esto es Solitario. Puedes emplearlo para generar tantos números de la secuencia de clave como te sean necesarios.
Sé que hay diferencias regionales en los mazos de cartas, dependiendo del país. En general, no importa la ordenación de palos que emplees o cómo conviertas las cartas en números. Lo que importa es que el emisor y el receptor hayan acordado las mismas reglas. Si no eres consistente no podrás comunicarte.
Introducir la clave en el mazo
Solitario es tan seguro como la clave. Es decir, la forma más simple de romper Solitario es descubrir la clave que los comunicantes están empleando. Si no dispones de una buena clave, el resto no importa. Aquí hay algunas sugerencias para intercambiar claves.
1. Baraja el mazo. Una clave aleatoria es la mejor. Uno de los comunicantes puede barajar un mazo aleatoriamente y luego crear otro mazo idéntico. Uno pasa al emisor y otro al receptor. La mayoría de la gente no sabe barajar bien, así que barájalo al menos diez veces, e intenta usar un mazo con el que se haya jugado en lugar de uno nuevo, recién sacado del paquete. Recuerda conservar un mazo extra con el orden de la clave, o en caso de error nunca podrás descifrar el mensaje. También recuerda que la clave está en peligro mientras exista; la policía secreta podría encontrar el mazo y copiar el orden.
2. Emplea una ordenación de bridge. Una descripción de manos de bridge que puedes encontrar en un periódico o un libro sobre bridge es aproximadamente una clave de 95 bits. Si los comunicantes se ponen de acuerdo en una forma de convertirlas en una ordenación del mazo y en una forma de situar los comodines (quizá después de las dos primeras cartas que se mencionan en la discusión del juego), puede valer. Atención: la policía secreta podría encontrar tu columna de bridge y copiar el orden. Puedes intentar establecer alguna convención repetible para la columna del bridge a emplear; por ejemplo, «usa la columna del bridge del periódico de tu ciudad del día en que cifraste el mensaje», o algo similar. O busca una serie de palabras en la web del New York Times, y emplea la columna de bridge del día del artículo que te aparece cuando buscas por esas palabras. Si se descubren las palabras, o las interceptan, parecerán una frase clave. Y elige tu propia convención; recuerda que la policía secreta también lee los libros de Neal Stephenson.
3. Utiliza una frase clave para ordenar el mazo. Este método emplea Solitario como un algoritmo para crear una ordenación inicial del mazo. Tanto el emisor como el receptor comparten la frase clave (por ejemplo, «CLAVE SECRETA»). Comienza con el mazo en un orden fijo, de la carta más baja a la más alta, de la forma habitual en el bridge. Realiza la operación Solitario, pero en lugar del paso 5, realiza otro corte contado empleando el primer carácter de la frase clave (3 en este ejemplo). (Recuerda colocar las cartas en la posición más alta sobre la carta más baja del mazo, como antes.) Hazlo para cada uno de los caracteres. Emplea otros dos caracteres para fijar la posición de los comodines. Pero recuerda, en el inglés habitual sólo hay alrededor de 1,4 bits de aleatoriedad por carácter. Para que sea realmente seguro querrás usar una frase clave de al menos 80 caracteres; yo recomiendo al menos 120 caracteres (lo lamento, pero no se puede obtener buena seguridad con una clave más corta).
Ejemplos
Aquí hay algunos ejemplos para que puedas practicar tus habilidades con el Solitario:
Ejemplo 1: Comienza con un mazo sin clave: A♣ hasta K♣, A♥ hasta K♥, A♦ hasta K♦, A♠ hasta K♠, comodín A, comodín B (puedes considerarlo como 1-52, A, B). Las primeras diez salidas son:
4 49 10 (53) 24 8 51 44 6 33
Hay que saltarse el 53, claro. Lo he puesto para que quede claro. Si el texto llano es:
AAAAA AAAAA
entonces el texto cifrado es:
EXKYI ZSGEH
Ejemplo 2: Empleando el método de clave 3 y la clave «FOO», las primeras quince salidas son:
8 19 7 25 20 (53) 9 8 22 32 43 5 26 17 (56) 38 48
Si el texto llano es todo A, entonces el texto cifrado es:
ITHZU JIWGR FARMW
Ejemplo 3: Empleando el método de clave 3 y la clave «CRYPTONOMICON», el mensaje «SOLITAIRE» se cifra como:
KIRAK SFJAN
Evidentemente, deberías usar claves más largas. Estos ejemplos son sólo como prueba. Hay más ejemplos en el sitio web, y puedes emplear el script Perl del libro para crear otros.
Seguridad por medio de la oscuridad
Solitario está diseñado para ser seguro incluso si el enemigo conoce el funcionamiento del algoritmo. He dado por supuesto que Criptonomicón se convertirá en un best seller, y que habrá ejemplares por todas partes. Doy por supuesto que la NSA y todos los demás estudiarán el algoritmo y estarán alerta. Doy por supuesto que el único secreto es la clave.
Por eso es tan importante mantener la clave secreta. Si guardas un mazo de cartas en un lugar seguro, deberías asumir que el enemigo al menos considerará la idea de que estés empleando Solitario. Si guardas una columna de bridge en la caja fuerte, es probable que eso produzca sospechas. Si se sabe que algún grupo emplea el algoritmo, es de esperar que la policía secreta mantenga una base de datos de columnas de bridge para usarlas en los intentos de desciframiento. Solitario es resistente incluso si el enemigo sabe que lo estás empleando, y un simple mazo de cartas sigue siendo menos incriminatorio que un programa de cifrado ejecutándose en tu portátil, pero el algoritmo no sustituye a la astucia.
Notas sobre la aplicación
La primera regla de cualquier cifra de flujo de salida-retroalimentación, cualquiera que sea, es que nunca debes usar dos veces la misma clave para cifrar dos mensajes diferentes. Repítelo conmigo: NO USAR NUNCA LA MISMA CLAVE PARA CIFRAR DOS MENSAJES DIFERENTES. Si lo haces, romperás por completo la seguridad del sistema. He aquí el porqué: si tienes dos cadenas cifradas, A+K y B+K, y las restas, obtienes (A+K)-(B+K) = A+K-B-K=A-B. Es decir, dos secuencias de textos llano combinadas, y eso es muy fácil de romper. Confía en mí: puede que tú no sepas recuperar A y B a partir de A-B, pero un criptoanalista profesional si podrá. Es de importancia vital: nunca emplees la misma clave para cifrar dos mensajes diferentes.
Que los mensajes sean cortos. El algoritmo está diseñado para emplearse con mensajes cortos: un par de miles de caracteres. Si tienes que cifrar una novela de 100.000 palabras, emplea un algoritmo informático. Emplea abreviaturas, taquigrafía y jerga en los mensajes. No seas prolijo.
Para obtener la seguridad máxima, intenta hacerlo todo de cabeza.
Si la policía secreta empieza a derribar la puerta, limítate a barajar con calma el mazo de cartas (no lo arrojes al aire; te sorprendería saber hasta qué punto se mantiene la ordenación de un mazo durante una partida de 52-Pickup). Recuerda barajar también el mazo de repuesto, si lo tienes.
Análisis de seguridad
Hay mucho, pero es demasiado complejo para reproducirlo aquí. Ve a http://www.counterpane.com, o escribe a Counterpane Systems, 1711 North Ave #16, Oak Park, IL 60302.
Para saber más
Recomiendo mi propio libro, Applied Cryptography (John Wiley & Sons, 1996), como un buen lugar para empezar. Luego lee The Codebreakers de David Kahn (Scribner, 1996). A continuación, hay varios libros sobre criptografía informática, y varios sobre criptografía manual. Puedes suscribirte a mi boletín de correo electrónico gratuito en http://www.counterpane.com/crypto-gram.html o enviando un mensaje de correo en blanco a crypto-gram-subscribe@chaparraltree.com. Es un campo divertido; buena suerte.