RSA. Sistemas de clave pública

 
  1. Sistemas de Clave Pública
  2. Encriptación de clave pública
  3. Algoritmo de Rivest, Shamir y Adelman (RSA)
  4. Gestión de claves
  1. Ejemplo
  2. Conclusiones

Sistemas de Clave Pública


Uno de los criterios con los que se diseña un sistema informático(SI) es el de la seguridad. Seguridad es la facultad de estar a cubierto de algún riesgo o amenaza. Los SI deben incorporar mecanismos que permitan ofertar unos servicios de seguridad a los usuarios. Los criterios fundamentales al establecer la seguridad de la información son:

La confidencialidad es la que más directamente está relacionada con los métodos criptográficos ya que la criptografía es la ciencia que estudia la escritura secreta.

Un sistema criptográfico consta de 5 componentes:

Atendiendo al criterio de utilizar o no la misma clave para el cifrado y descifrado, los criptosistemas se pueden dividir en:
Indice

Encriptación de clave pública


El encriptado de clave pública se propuso por primera vez en 1.976 por Diffie y Hellman. Se basa en funciones matemáticas en lugar de sustituciones y permutaciones. Antes de entrar en describir su modo de funcionamiento diremos que sus características principales son:

Modo de funcionamiento

Dependiendo de la característica de seguridad (secreto, autenticidad) que se pretenda implementar, el modo de funcionamiento es el siguiente:
  1. Característica de confidencialidad
  2. Característica de autenticidad
Indice

Algoritmo de Rivest, Shamir y Adelman (RSA)


Fue desarrollado en 1.977 por estos autores en el MIT y es el único algoritmo mundialmente aceptado como encriptado de clave pública. Se basa en el problema de la factorización de un número con un gran número de cifras en sus factores primos.

En el RSA el texto motivo M y el texto cifrado C se califican como enteros entre 0 y n-1 para un n dado. La función de cifrado es c(e,n), donde emisor debe conocer los valores e y n

La función de descifrado es dc(d,n), donde el receptor debe de conocer los valores de d y n. Por lo tanto éste es un algoritmo de clave pública donde la clave pública es e, n, y la clave privada es d,n.

La generación de las claves se hace de la siguiente forma:

  1. Se relacionan dos números primos p y q cuyo producto es n= p·q
  2. Calculamos el valor d(n) (totalizada de Euler de n) que es el nº de dispositivos menores que n y relativamente primos a n.
  3. Se relaciona el entero d que es relativamente primo al valor d(n), esto es que al máximo común divisor de d y (n) debe ser 1.
  4. Se calcula e como la inversa de d, módulo d(n).
Características del algoritmo: Las técnicas para inutilizar el algoritmo RSA son dos:
Indice

Gestión de claves


Para que el método de cifrado sea válido es necesaria la protección adecuada de las claves y, por lo tanto, son necesarias una serie de procedimientos adecuados a la gestión de claves. La gestión de claves son una serie de técnicas de generación, almacenamiento, distribución y mantenimiento, aplicada a la información almacenada y transmitida a las redes de ordenadores.

En caso de que el usuario pierda una clave privada debe comunicarlo inmediatamente a la entidad certificadora para que anule la pública. La entidad certificadora además mantiene los períodos de validez de los pares de claves y, para ello, utiliza la técnica de 'time- stamping' o sellado en el tiempo por el cual la entidad certifica que el emisor transmite un mensaje a través de ella en período válido de las claves.
Indice

Ejemplo


Sea una codificación del alfabeto que transforma las letras de la A a la Z en los números del 0 al 25 (utilizaremos el alfabeto español sin considerar la LL, Ñ ni la CH ). Nosotros seremos el usuario A, cuya clave publica es (na, eA)=(155011,2347) y cuya clave privada es dA =151267. Deseamos enviar un mensaje al usuario B utilizando la codificación anterior.

Veamos como el usuario B elabora su clave publica y su clave privada.

El usuario B elige 2 números primos pB=281 y qB=167, calcula nB=281*167=469127 y considera el conjunto reducido de residuos modulo nB a R46927. La función de Euler para R46927 vale f(46927)=280*166=46480. El usuario B elige él numero eB =39423 y comprueba que mod(39423, 46480)=1. A continuación determina el dB / dB * 39423 º 1 (mod 46480), donde dB = 26767. Por tanto, la clave publica de B vale (nB , eB ) = (46927, 39423), y su clave privada vale dB = 26767.
Para enviar un mensaje a B, debemos determinar en primer lugar la longitud del mismo, teniendo en cuenta que vamos a codificar las letras del mensaje como un único numero en base 26. Como el mensaje codificado ha de pertenecer al conjunto reducido de residuos modulo nB , RnB , su longitud no puede exceder elvalor nB =46927. Puesto que 25*26 ^ 0 + 25*26 ^ 1 + 25*26 ^ 2 + < 46927 < 25*26 ^ 0 + 25*26 ^ 1 + 25*26 ^ 2 + +25*26 ^ 3 el mensaje ha de tener un máximo de 3 letras. Si se desea enviar un mensaje más largo habrá que romper el mensaje original en grupo de 3 letras.

Ahora vamos a enviar a B el mensaje “YES”. Para enviar el mensaje hemos de codificarlo, es decir, expresarlo en base 26, de modo que el mensaje sea un elemento de RnB .

YES = Y*26 ^ 2 + E*26 ^ 1 + S*26 ^ 0 = 24*26 ^ 2 + 4*26 ^ 1 + 18*26 ^ 0 = 16346 = m.

Ahora encriptamos m con la clave publica de B.

c = (16346)39423 mod 46927 = 21166

Decodificamos el mensaje encriptado

c =1*26 ^ 3 + 5*26 ^ 2 + 8*26 ^ 1 + 2*26 ^ 0= BFIC

Por tanto el mensaje que se envía a B es “BFIC”. Para que B pueda recuperar el mensaje, deberá codificar los datos reducidos en base 26, y a continuación aplicar la función de desencriptado.

BFIC = 1*26 ^ 3 + 5*26 ^ 2 + 8*26 ^ 1 + 2*26 ^ 0 = c

         Ahora B recuperara a m calculando , con ayuda de su clave privada.
m= (21166)26767 mod 46927 =21166

Se decodifica m y se obtiene el texto original.

m =24*26 ^ 2 + 4*26 ^ 1 + 18*26 ^ 0 = YES

Ejemplos con OpenSSL para generar una clave:
 

#include <openssl/rsa.h>
#include <stdlib.h>

void introduce (void);
 

main()
{
   RSA *clave;

   introduce();
   clave= RSA_generate_key(64, 17, NULL, NULL);
/* funcion de openssl/rsa.h que genera una clave de rsa de 64 bits con */
/* clave publica 17*/
}
 

void introduce (void)
{
   int *vector;
   int indice;

   vector= (int *) malloc (sizeof(int)*1000);
   for (indice= 0; indice< 1000; indice++)
            vector[indice]= rand();
 

 /* Ahora faltaria una funcion que generara numeros aleatorios */
}

Ejemplo con OpenSSL para generar claves automaticamente:

                  - Generar una clave privada RSA:

                 openssl genrsa -out clave.pem

                  - Convertir una clave en una clave privada RSA:

                   openssl rsa -in clave1.pem -out clave2.pem

                  - Encriptar una clave privada usando triple DES:

                    openssl rsa -in clave1.pem -des3 -out clave2.pem

 
Indice

Conclusiones


El sistema de encriptación de clave publica RSA es del orden de 1000 veces mas lento que cualquier algoritmo de cifrado de clave privada como el DES. No obstante, a pesar de esta deficiencia, el criptosistema RSA ( y otras de clave publica) se utilizan mucho porque permiten firmar digitalmente los mensajes que se envían. Dado que el criptosistema RSA es bastante lento en su ejecución, generalmente se utiliza en conjunción con el criptosistema de clave privada DES de la siguiente manera:

  1. A se quiere comunicar con B, y para ello elige un numero aleatorio s de 168 bits y lo cifra utilizando la clave publica de B.
  2. B descifra el paquete con su clave privada y obtiene s. Este numero se ha transmitido de forma confidencial.
A partir de ese momento, todo lo que A envía lo cifra con tripleDES, utilizando a s (conocida como clave de sesión ) como clave del tripleDES, y B lo descifra también con ayuda de s. De esta manera se aumenta sustancialmente la cantidad de información transmitida ya que DES es mucho más rápido tanto para el cifrado como para el descifrado.
Indice