Ir al contenido principal

Criptografía (CCXXIX): ¿Sabías que...? (XXIV)

En "Criptonomicón" ('Cryptonomicon') de Neal Stephenson, publicada originalmente en 1999 y por aquella época novela de culto de los hackers, un personaje, Enoch Root, le describe a otro, Randy Waterhouse, un criptosistema al que se refiere como "Pontifex" y, posteriormente, intercambian varios mensajes utilizándolo.

En realidad el algoritmo criptográfico es el conocido como "Solitario" ('Solitaire'), pero en la novela se refieren a él con el nombre de "Pontifex" para ocultar el hecho de que se emplea una baraja de cartas.

Este algoritmo criptográfico fue diseñado para esta novela por Bruce Schneier y, tal y como nos cuenta en su sitio web, lo hizo con las premisas básicas de que fuera utilizado manualmente (sistema de lápiz y papel), mediante una herramienta independiente de la electrónica y no sospechosa, es decir, aparentemente inocente y, por tanto, no incriminatoria, y, al mismo tiempo, dotarlo de una seguridad 'high-tech'.

En la novela, Enoch Root lo describe de forma general como un criptosistema que "emplea una permutación de 54 elementos como clave —¡una clave por mensaje, por supuesto!— y emplea esa permutación (que representaremos como T) para generar un flujo de clave que se añade, módulo 26, al texto llano (P), como en un cuaderno de uso único. El proceso de generar cada carácter en el flujo de clave altera T de una forma reversible pero más o menos «aleatoria»".

Lo que me recuerda mucho, también se menciona en la novela, a RC4 (ver este post donde explico este criptosistema), y, al igual que éste, 'Solitaire' es un algoritmo de cifrado simétrico (se utiliza la misma clave para cifrar y para descifrar) y de flujo ('Stream cipher').

Voy a ver si lo he entendido y para ello utilizo como base un ejemplo que figura en el sitio web de Bruce Schneier, y lo voy a desarrollar de forma análoga a lo que indiqué para RC4 en el post al que me he referido antes

En este primer ejemplo no utilizaré clave: mensaje a cifrar (M) = "AAAAA" y clave (K) = "".

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"

El algoritmo "Solitario" ('Solitaire'), al igual que RC4, puede entenderse como compuesto por tres etapas:

1.- Inicialización de la baraja:

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':
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 (como he comentado antes en este primer ejemplo no utilizo clave, y, por tanto, parto sólo de la posición inicial de la baraja).

2.1.- Busco el comodín 'A' y lo muevo debajo de la carta que tiene justo debajo (si el comodín 'A' está situado al final de la baraja lo muevo debajo de la primera carta).

Busco el comodín 'B'  y lo muevo debajo de la carta que está debajo de la que tiene justo debajo (si el comodín 'B' está situado al final de la baraja lo muevo debajo de la segunda carta de la misma y si está como anteúltima carta lo muevo debajo de la primera).
2.2.- Corto la baraja en tres partes: la primera con las cartas comprendidas entre la primera y el primer comodín que encuentro (en el ejemplo el comodín 'B'), excluido este primer comodín, la segunda con las cartas comprendidas entre el primer comodín que encuentro, incluido éste, y el segundo comodín, incluido éste, y la tercera con las cartas comprendidas entre el segundo comodín, excluido éste, y la última carta, e intercambio las partes uno y tres, o, lo que es lo mismo, intercambio las cartas que están antes del primer comodín que encuentro con las que están detrás del segundo comodín:
2.3.- La última carta es el AS de tréboles, por lo que muevo 1 carta (el número asignado a esa carta al inicializar la baraja. Si la última carta es un comodín la baraja no sufre cambios) del inicio de la baraja justo encima de la última carta:
Ahora, la primer carta es el 2 de tréboles, por lo que cuento 2 cartas (el número asignado a esa carta al inicializar la baraja. Si la primera carta es cualquiera de los dos comodines se contarían 53 cartas) desde el principio de la baraja, y el primer 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 tercera carta es el 4 de tréboles y, por tanto, 4).

2.4.- Repito los pasos anteriores de esta segunda etapa (2.1 a 2.3) 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 Rey de picas, por lo que muevo 52 cartas del inicio de la baraja justo encima de la última carta:
Ahora, la primer carta es la Reina de picas, por lo que cuento 51 cartas desde el principio de la baraja, y el segundo 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 quincuagésima segunda carta es el 10 de picas y, por tanto, 49).

- 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 As de tréboles, por lo que muevo 1 carta del inicio de la baraja justo encima de la última carta:
Ahora, la primer carta es el cinco de tréboles, por lo que cuento 5 cartas desde el principio de la baraja, y 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 sexta carta es el 10 de tréboles y, por tanto, 10).

- 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 2 de tréboles, por lo que muevo 2 cartas del inicio de la baraja justo encima de la última carta:
Ahora, la primer carta es el tres de tréboles, por lo que cuento 3 cartas desde el principio de la baraja, y la siguiente carta, es decir, la cuarta carta es un comodín, por lo que vuelvo a repetir los pasos anteriores.

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 6 de tréboles, por lo que muevo 6 cartas del inicio de la baraja justo encima de la última carta:
Ahora, la primer carta es la Reina de tréboles, por lo que cuento 12 cartas desde el principio de la baraja, y el cuarto 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 decimotercera carta es la Sota de diamantes y, por tanto, 24).

- 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 el 3 de tréboles, por lo que muevo 3 cartas del inicio de la baraja justo encima de la última carta:
Ahora, la primer carta es el 6 de tréboles, por lo que cuento 6 cartas desde el principio de la baraja, y el quinto 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 séptima carta es el 8 de tréboles y, por tanto, 8)

Con lo que el flujo de clave ('key-stream') es: 4 49 10 24 8

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.

En el ejemplo:

- Primera letra del criptograma:
1ª letra del mensaje a cifrar = 'A' = 1; (1 + 4) mod 26 = 5 = 'E'.
-  Segunda letra del criptograma:
2ª letra del mensaje a cifrar = 'A' = 1; (1 + 49) mod 26 = 24 = 'X'.
-  Tercera letra del criptograma:
3ª letra del mensaje a cifrar = 'A' = 1; (1 + 10) mod 26 = 11 = 'K'.
-  Cuarta letra del criptograma:
4ª letra del mensaje a cifrar = 'A' = 1; (1 + 24) mod 25 = 25 = 'Y'.
-  Quinta letra del criptograma:
5ª letra del mensaje a cifrar = 'A' = 1; (1 + 8) mod 25 = 9 = 'I'.

Con lo que obtengo el siguiente criptograma (C): EXKYI


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 = 'E' = 5; (5 - 4) mod 26 = 1 = 'A'.
- Segunda letra del texto en claro:
2ª letra del criptograma = 'X' = 24; (24 - 49) mod 26 = 1 = 'A'.
- Tercera letra del texto en claro:
3ª letra del criptograma = 'K' = 11; (11 - 10) mod 26 = 1 = 'A'.
Cuarta letra del texto en claro:
4ª letra del criptograma = 'Y' = 25; (25 - 24) mod 26 = 1 = 'A'.
Quinta letra del texto en claro:
5ª letra del criptograma = 'I' = 9; (9 - 8) mod 26 = 1 = 'A'.

Con lo que obtengo el siguiente mensaje descifrado (M): AAAAA

En un próximo post pondré un ejemplo utilizando una clave, lo que, lógicamente, es fundamental, ya que la seguridad de cualquier criptosistema reside en ella.

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