Ir al contenido principal

Criptografía (CCXXX): ¿Sabías que...? (XXV)

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


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

Entradas populares de este blog

Criptografía (I): cifrado Vigenère y criptoanálisis Kasiski

Hace unos días mi amigo Iñaki Regidor ( @Inaki_Regidor ), a quien dedico esta entrada :), compartió en las redes sociales un post titulado "Criptografía: el arte de esconder mensajes"  publicado en uno de los blogs de EiTB . En ese post se explican ciertos métodos clásicos para cifrar mensajes , entre ellos el cifrado de Vigenère , y , al final del mismo, se propone un reto consistente en descifrar un mensaje , lo que me ha animado a escribir este post sobre el método Kasiski  para atacar un cifrado polialfabético ( conociendo la clave descifrar el mensaje es muy fácil, pero lo que contaré en este post es la forma de hacerlo sin saberla ). El mensaje a descifrar es el siguiente: LNUDVMUYRMUDVLLPXAFZUEFAIOVWVMUOVMUEVMUEZCUDVSYWCIVCFGUCUNYCGALLGRCYTIJTRNNPJQOPJEMZITYLIAYYKRYEFDUDCAMAVRMZEAMBLEXPJCCQIEHPJTYXVNMLAEZTIMUOFRUFC Como ya he dicho el método de Vigenère es un sistema de sustitución polialfabético , lo que significa que, al contrario que en un sistema de

¿Qué significa el emblema de la profesión informática? (I)

Todas o muchas profesiones tienen un emblema que las representa simbólicamente y en el caso de la  informática: " es el establecido en la resolución de 11 de noviembre de 1977  para las titulaciones universitarias superiores de informática, y  está constituido por una figura representando en su parte central  un  núcleo toroidal de ferrita , atravesado por  hilos de lectura,  escritura e inhibición . El núcleo está rodeado por  dos ramas : una  de  laurel , como símbolo de recompensa, y la otra, de  olivo , como  símbolo de sabiduría. La  corona  será la  de la casa real  española,  y bajo el escudo se inscribirá el acrónimo de la organización. ". Veamos los diferentes elementos tomando como ejemplo el emblema del COIIE/EIIEO (Colegio Oficial de Ingenieros en Informática del País Vasco/ Euskadiko Informatikako Ingeniarien Elkargo Ofiziala ) . Pero no sólo el COIIE/EIIEO adopta el emblema establecido en dicha resolución, sino que éste se adopta también como im

Criptografía (XXIII): cifrado de Hill (I)

En este post me propongo explicar de forma comprensible lo que he entendido sobre el cifrado de Hill , propuesto por el matemático Lester S. Hill , en 1929, y que se basa en emplear una matriz como clave  para cifrar un texto en claro y su inversa para descifrar el criptograma correspondiente . Hay tres cosas que me gustan de la criptografía clásica, además de que considero que ésta es muy didáctica a la hora de comprender los sistemas criptográficos modernos: la primera de ellas es que me "obliga" a repasar conceptos de matemáticas aprendidos hace mucho tiempo y, desgraciadamente, olvidados también hace demasiado tiempo, y, por consiguiente, que, como dice  Dani , amigo y coautor de este blog, me "obliga" a hacer "gimnasia mental"; la segunda es que, en la mayoría de las ocasiones, pueden cifrarse y descifrase los mensajes, e incluso realizarse el criptoanálisis de los criptogramas, sin más que un simple lápiz y papel, es decir, para mi es como un pasat