Decía en el
post anterior que iba a poner un
ejemplo, utilizando una clave, del algoritmo critográfico "Solitario" (
'Solitaire') inventado por
Bruce Schneier para la novela
"Criptonomicón" (
'Cryptonomicon') de
Neal Stephenson.
Tal y como decía en dicho post, la clave es fundamental, porque es en ella donde reside la seguridad de cualquier criptosistema.
Antes que nada, comentar que la clave podría consistir en barajar bien la baraja de cartas en la posición inicial indicada en el post anterior y que, tras ello, el emisor y el receptor utilicen sendos mazos con el orden de las cartas obtenido. Después, para cifrar y descifrar, bastaría con seguir los pasos que se explican en el citado post, pero creo que este sistema de clave tiene varios inconvenientes: si se desordena por accidente o se pierde un mazo, la parte que se queda sin el mazo clave no podrá cifrar ni descifrar mensajes; la distribución de la clave se complica, y, además, hay que hacerla de forma muy frecuente porque cada mazo clave sólo se debe utiliza una vez (libreta de un sólo uso, 'one-time pad') para no comprometer el cifrado; y si un atacante se hace con un mazo clave podrá cifrar o descifrar un mensaje sin problemas. Por todo ello, creo que el mejor sistema es que el emisor y el receptor compartan una clave secreta (K) formada por palabras, lo que facilita la distribución de claves (se pueden poner de acuerdo para utilizar como clave las palabras de un libro, de un periódico,...) y dificulta el que un atacante se haga con ellas.
Pues bien, el ejemplo con clave que voy a desarrollar, que aparece en el sitio web de Bruce Schneier, es el siguiente:
- Mensaje a cifrar (M) = "AAAAA".
- Clave = "FOO".
Divido M en grupos de cinco letras (sólo las 26 letras mayúsculas del alfabeto inglés, de la 'A' a la 'Z') y, si hace falta, completo el último grupo de cinco con caracteres de relleno (por ejemplo: 'X').
M = "AAAAA"
Realizo las tres etapas que indiqué en el post anterior, con un paso añadido en la primera para "introducir" la clave en la baraja.
1.- Inicialización de la baraja:
1.1.- Utilizo una baraja de póquer con dos comodines ('jokers') y numero sus cartas secuencialmente del 1 al 52 (del As al Rey y con el siguiente orden de sus palos: tréboles, diamantes, corazones y picas), y a los dos comodines, que deben ser distintos, los rotulo como 'A' y 'B':
Y es aquí donde interviene la clave secreta (K) compartida por el emisor y el receptor. Se trata de, a partir de la baraja en su posición inicial, obtener un mazo pseudoaletorio que se utilizará después para obtener el flujo de clave ('key-stream'), bien sea barajando, bien desordenado la baraja mediante una clave compuesta por palabras, o bien mediante cualquier otro sistema acordado por emisor y receptor que permute las cartas de la posición inicial.
1.2.-
En el ejemplo, tal y como he comentado,
utilizo una clave secreta (K) = "FOO" y actúo de la siguiente manera para cada uno de los caracteres de la clave. Básicamente, se trata de obtener un mazo pseudoaleatorio una vez realizados los pasos del algoritmo
"Solitario" (
'Solitaire'), pero utilizando cada uno de los caracteres de la clave en lugar de la última carta después del corte triple (intercambio de las cartas antes del primer comodín que se encuentra con las cartas después del segundo comodín:
- Para el primer carácter de la clave (K): 'F'
Muevo el comodín 'A' y el 'B':
Intercambio las cartas que están antes del primer comodín que encuentro con las que están detrás del segundo comodín:
La última carta es el As de tréboles, por lo que muevo 1 carta (número asignado a la carta en la posición inicial de la baraja) del inicio de la baraja justo encima de la última carta: Convierto a un número el primer carácter de la clave, 'A' = 1; 'B' = 2;... ; 'Z', = 26. En el ejemplo el primer carácter de la clave es "F", por lo que muevo 6 cartas del inicio de la baraja justo encima de la última carta:
-
Para el segundo carácter de la clave (K):
'O'
Muevo el comodín 'A' y el 'B':
Intercambio las cartas que están antes del primer comodín que encuentro con las que están detrás del segundo comodín:
La última carta es el Rey de picas por lo que muevo 52 cartas (número asignado a la carta en la posición inicial de la baraja, es decir: 13 cartas de tréboles + 13 cartas de diamantes + 13 cartas de corazones + 13 cartas de picas) del inicio de la baraja justo encima de la última carta:
Convierto a un número el segundo carácter de la clave, 'A' = 1; 'B' = 2;... ; 'Z', = 26. En el ejemplo el segundo carácter de la clave es "O", por lo que muevo 15 cartas del inicio de la baraja justo encima de la última carta:
- Para el tercer carácter de la clave (K): 'O'
Muevo el comodín 'A' y el 'B':
Intercambio las cartas que están antes del primer comodín que encuentro con las que están detrás del segundo comodín:
La última carta es el 2 de tréboles, por lo que muevo 2 cartas (número asignado a la carta en la posición inicial de la baraja) del inicio de la baraja justo encima de la última carta:
Convierto a un número el tercer carácter de la clave, 'A' = 1; 'B' = 2;... ; 'Z', = 26. En el ejemplo el tercer carácter de la clave es "O", por lo que muevo 15 cartas del inicio de la baraja justo encima de la última carta:
Y una vez hecho lo anterior, ya tengo el mazo pseudoaleatorío con el que cifrar el mensaje en claro (M) del ejemplo sin más que aplicar la etapa 2 del algoritmo explicada en el post anterior.
2.- Generación del flujo de clave ('key-stream') a partir de la posición inicial de la baraja y la clave secreta (K) compartida por el emisor y el receptor:
- Primer número del flujo de clave ('key-stream'):
Muevo el comodín 'A' y el 'B':
Intercambio las cartas que están antes del primer comodín que encuentro con las que están detrás del segundo comodín:
La última carta es el 8 de tréboles, por lo que muevo 8 cartas (número asignado a la carta en la posición inicial de la baraja) del inicio de la baraja justo encima de la última carta:
Ahora, la primer carta es el comodín 'A', por lo que cuento 53 cartas (el número asignado a cualquiera de los dos comodines es 53) desde el principio de la baraja, por lo que el primer número del flujo de clave ('key-stream') es el número asignado a la siguiente carta en la posición inicial de la baraja (en el ejemplo la quincuagésima cuarta carta es el 8 de tréboles y, por tanto, 8).
Repito los pasos anteriores de esta segunda etapa hasta obtener un flujo de clave ('key-stream') de la misma longitud que el mensaje a cifrar (M), en el ejemplo hay que repetirlos 4 veces más, ya que M tiene una longitud de 5 caracteres.
- Segundo número del flujo de clave ('key-stream'):
Muevo el comodín 'A' y el 'B':
Intercambio las cartas que están antes del primer comodín que encuentro con las que están detrás del segundo comodín:
La última carta es el 9 de tréboles, por lo que muevo 9 cartas (número asignado a la carta en la posición inicial de la baraja) del inicio de la baraja justo encima de la última carta:
Ahora, la primer carta es el 7 de corazones, por lo que cuento 33 cartas (el número asignado a esa carta en la posición inicial de la baraja, es decir: 13 cartas de tréboles + 13 cartas de diamantes + 7 cartas de corazones = 33) desde el principio de la baraja, por lo que el segundo número del flujo de clave ('key-stream') es el número asignado a la siguiente carta en la posición inicial de la baraja (en el ejemplo la trigésima cuarta carta es el 6 de diamantes y, por tanto, 19, es decir: 13 cartas de tréboles + 6 cartas de diamantes).
- Tercer número del flujo de clave ('key-stream'):
Muevo el comodín 'A' y el 'B':
Intercambio las cartas que están antes del primer comodín que encuentro con las que están detrás del segundo comodín:
La última carta es el Rey de tréboles, por lo que muevo 13 cartas del inicio de la baraja (el número asignado a esa carta en la posición inicial de la baraja) justo encima de la última carta:
Ahora, la primer carta es la Reina de diamantes, por lo que cuento 25 cartas (el número asignado a esa carta en la posición inicial de la baraja, es decir: 13 cartas de tréboles + 12 cartas de diamantes = 25) desde el principio de la baraja, por lo que el tercer número del flujo de clave ('key-stream') es el número asignado a la siguiente carta al inicializar la baraja (en el ejemplo la vigésima sexta carta es el 7 de tréboles y, por tanto, 7).
- Cuarto número del flujo de clave ('key-stream'):
Muevo el comodín 'A' y el 'B':
Intercambio las cartas que están antes del primer comodín que encuentro con las que están detrás del segundo comodín:
La última carta es el 8 de corazones, por lo que muevo 34 cartas (el número asignado a esa carta en la posición inicial de la baraja, es decir: 13 cartas de tréboles + 13 cartas de diamantes + 8 cartas de corazones = 34) del inicio de la baraja justo encima de la última carta:
Ahora, la primer carta es el 4 de diamantes, por lo que cuento 17 cartas (el número asignado a esa carta en la posición inicial de la baraja, es decir: 13 cartas de tréboles + 4 cartas de diamantes = 17) desde el principio de la baraja, por lo que el tercer número del flujo de clave ('key-stream') es el número asignado a la siguiente carta en la posición inicial de la baraja (en el ejemplo la decimoctava carta es la Reina de diamantes y, por tanto, 25, es decir: 13 cartas de tréboles + 12 cartas de diamantes = 25).
- Quinto número del flujo de clave ('key-stream'):
Muevo el comodín 'A' y el 'B':
Intercambio las cartas que están antes del primer comodín que encuentro con las que están detrás del segundo comodín:
La última carta es la reina de diamantes, por lo que muevo 25 cartas (el número asignado a esa carta en la posición inicial de la baraja, es decir: 13 cartas de tréboles + 12 cartas de diamantes = 25) del inicio de la baraja justo encima de la última carta:
Ahora, la primer carta es el 2 de diamantes, por lo que cuento 15 cartas (el número asignado a esa carta en la posición inicial de la baraja, es decir: 13 cartas de tréboles + 2 cartas de diamantes = 15) desde el principio de la baraja, por lo que el tercer número del flujo de clave ('key-stream') es el número asignado a la siguiente carta al inicializar la baraja (en el ejemplo la decimosexta carta es el 7 de diamantes y, por tanto, 20, es decir: 13 cartas de tréboles + 7 cartas de diamantes = 20).
Con lo que el flujo de clave ('key-stream') es: 8 19 7 25 20
3.- Cifrado:
Suma módulo 26 de los números correspondientes a cada carácter del mensaje a cifrar (M), 'A' = 1; 'B' = 2;... ; 'Z' = 26, con los correspondientes al flujo de clave ('key-stream') obtenido en la etapa anterior.
- Primera letra del criptograma:
1ª letra del mensaje a cifrar = 'A' = 1; (1 + 8) mod 26 = 9 = 'I'.
- Segunda letra del criptograma:
2ª letra del mensaje a cifrar = 'A' = 1; (1 + 19) mod 26 = 20 = 'T'.
- Tercera letra del criptograma:
3ª letra del mensaje a cifrar = 'A' = 1; (1 + 7) mod 26 = 8 = 'H'.
- Cuarta letra del criptograma:
4ª letra del mensaje a cifrar = 'A' = 1; (1 + 25) mod 26 = 26 = 'Z'.
- Quinta letra del criptograma:
5ª letra del mensaje a cifrar = 'A' = 1; (1 + 20 mod 26 = 21 = 'U'.
Con lo que obtengo el siguiente criptograma (C): ITHZU
Y para descifrar bastará con restar módulo 26 a los números correspondientes a cada carácter del criptograma (C), 'A' = 1; 'B' = 2;... ; 'Z' = 26, los correspondientes al flujo de clave ('key-stream').
En el ejemplo:
- Primera letra del texto en claro:
1ª letra del criptograma = 'I' = 9; (9 - 8) mod 26 = 1 = 'A'.
- Segunda letra del texto en claro:
2ª letra del criptograma = 'T = 20; (20 - 19) mod 26 = 1 = 'A'.
- Tercera letra del texto en claro:
3ª letra del criptograma = 'H' = 8; (8 - 7) mod 26 = 1 = 'A'.
- Cuarta letra del texto en claro:
4ª letra del criptograma = 'Z' = 26; (26 - 25) mod 26 = 1 = 'A'.
- Quinta letra del texto en claro:
5ª letra del criptograma = 'U' = 21; (21 - 20) mod 26 = 1 = 'A'.
Con lo que obtengo el siguiente mensaje descifrado (M): AAAAA
Para finalizar, como también decía en el post anterior, creo que este criptosistema opera de forma muy similar a RC4 (ver este post donde lo explico).
Es decir, gráficamente, para cifrar:
Y para descifrar:
Comentarios
Publicar un comentario