Para completar la serie
de artículos sobre criptografía, voy en este artículo
a intentar dar a conocer un poco más el sistema RSA de
clave pública. No haremos muchas matemáticas esta
vez.
En los sistemas tradicionales
de cifrado debe comunicarse una clave entre el emisor y el receptor
del mensaje, el problema aquí es encontrar un canal seguro
para transmitir dicha clave. Este problema viene a resolverse
en los sistemas de clave pública (public key criptography)
haciendo pública la clave de cifrado, pues un tiempo enormemente
grande de ordenador es necesario para encontrar una transformación
de descifrado a partir de la del cifrado.
Concretando: en una
red de n individuos cada uno de ellos produce una clave del tipo
especificado por el sistema de cifrado, reteniendo cierta información
que se usó en la construcción de la transformación
E(K) obtenida según la clave K y ciertas reglas.
Se hace accesible a
todo el mundo un listado de claves K1, K2, ... , Kn. Cuando un
individuo i quiere mandar un mensaje a otro individuo j utiliza
una transformación que llamaremos EKj. Para descifrar el
mensaje, j aplica la transformación inversa DKj al mensaje
cifrado. Ya que la transformación inversa DKj no puede
ser encontrada en un periodo de tiempo razonable, nadie puede
descifrar el mensaje dirigido a j a pesar de conocer su clave.
El RSA es un sistema
de clave pública inventado por Rivest,
Shamir y Adleman basado en la
exponenciación modular donde las claves son pares de números
(e n) formados por un exponente e y un módulo n que es
el producto de dos grandes -grandísimos realmente - números
primos p y q tales que mcd(e, fi(n))=1 (donde fi(n) es el número
de enteros menores que n y primos con él)
*Puedes encontrar más cosas sobre primos incluyendo una
pequeña calculadora aquí.
Para cifrar un mensaje
convertimos las letras que lo forman en sus equivalentes numéricos
y formamos bloques del mayor tamaño posible con un número
par de dígitos. Entonces el cifrado del bloque P sería
(P)=C=P^e(mod n). El procedimiento de descifrado requiere el conocimiento
de un inverso d de e módulo fi(n). Entonces D(C)=P=C^d(mod
n). El par (d, n) es la clave de descifrado.
Desarrollemos un ejemplo
donde n=43.59 (números primos muchísimo más
pequeños de los que usaríamos realmente). Tomemos
e=13 como exponente, observad que es válido pues mcd(e,
fi(n))=mcd(13, 42.58)=1. Para cifrar la frase PUBLIC KEY CRIPTOGRAPHY
obtenemos sus equivalentes numéricos 1520 0111 0802 1004
2402 1724 1519 1406 1700 1507 2423 (hemos usado A=00, B=01...)
donde hemos añadido una X (23) para rellenar el último
bloque. Ahora transformamos bloque a bloque usando C=P^13(mod
2537); con el primero tenemos C=1520^13=95(mod 2537) [incluimos
una explicación
detallada sobre este cálculo] y el resultado final
sería 0095 1648 1410 1299 0811 2333 2132 0370 1185 1457
1084
Para recuperar el texto
original necesitamos un inverso de 13 módulo fi(2537)=42.58=2436.
Un cálculo bastante breve muestra que el d=937 es ese inverso
así que el descifrado sería P=C^937(mod 2537). Por
ejemplo con el primer bloque 0095^937=1520(mod 2537) y así
procederíamos con todos los bloques que forman el texto
cifrado.
Me encantaría
recibir vuestros comentarios. ¿ Queréis código,
mas explicaciones, ...? Pues a escribir.