viernes, 19 de agosto de 2016

El Sistema de Encriptación RSA Introducción



 En el post anterior, se comentaron las bases de los sistema de encriptación de clave pública, hoy nos centramos en uno de los más populares, el RSA.

El RSA es un criptosistema de clave pública que sirve tanto para encriptar mensajes como para autenticación de documentos o transacciones (firmas digitales). Fue desarrollado en 1977 por Ron Rivest, Adi Shamir y Leonard Adleman  (RSA), los cuales aparecen en la siguiente imagen:

Adi Shamir, Ronald Rivest y  Leonard Adleman cuando eran estudiantes en el MIT
El usuario A que desea enviar un mensaje tiene una clave pública que le ha sido suministrada: dos números (n, e), esta clave es usada para enviar mensajes encriptados al usuario B, que posee la clave privada para desencriptar el mensaje.

Tenemos por lo tanto dos sistemas de claves:

  • Clave pública formada por los pares (n,e), que conoce A
  • Clave privada formada por los pares (n,d), que solo conoce B.

Los valores d y e se les conoce como los exponentes privado y público respectivamente.

La primera cuestión que se nos plantea es ¿Cómo obtenemos estos números?, es decir que criterio hemos de seguir para obtener la terna (n,e,d) y crear el sistema de claves públicas y privadas, evidentemente esto lo ha de hacer el usuario B y sólo parte de esta información pasa al usuario A.

El valor de n va a ser un número producto de dos númeors primos, n = p × q. Dichos valores p y q sólo son conocidos por B, es decir el receptor del mensaje, es fundamental que que estos dos números primos sean muy grandes y además cumplan una serie de requisitos de calidad, de ello deriva la seguridad del sistema.

Los valores p y q deben ser guardados en secreto o destruidos, para evitar que cualquiera usuario que ha interceptado el mensaje, intente desencriptar el mensaje, ya que podría obtener la clave privada, otro método es factorizar el valor n, por ello los números p y q, han de ser primos grandes que además han de cumplir ciertos criterios.

Nos queda calcular el otro número de la clave pública, es decir el número e.

Para ello usamos la función de Euler φ(n) = (p − 1) × (q − 1).

Que responde a la pregunta ¿cuántos números más pequeños que n no tienen factores comunes con n?

La respuesta es φ(n) = (p − 1) × (q − 1) (siendo φ(n) la función de Euler ).

Calculamos un número entero e que esté dentro del rango 0 ≤ e ≤ φ(n) , que además sea primo relativo con el valor de φ(n), es decir que cunpla con la condición de que no tenga factores comunes con φ(n) (esto es, el máximo común divisor de e y φ(n) es 1).

El usuario A, además, dispone de una clave privada, un número d que sólo A conoce. Este número es el inverso de e módulo φ(n). Es decir, es el número d que verifica:

l ≤ d ≤ φ(n)

y además lo calculamos :

d ≡e-1mod φ(n).

Siendo un número d, menor que el valor n calculado anteriormente y que sea primo relativo al producto de φ(n) = (p − 1) × (q − 1), es decir que se cumpla:

e d=1 mod[(p-l)(q-l)]

Es importante que la clave secreta d sea muy grande. Wiener mostró en 1990 que si p está entre q y 2q (es típico) y d < n1/4/3, entonces d puede calcularse eficientemente a partir de n y e. Aunque valores de e tan bajos como 3 se han usado en el pasado, los exponentes pequeños en RSA están actualmente en desuso.

Y ahora vamos a describir el proceso:

Tenemos un texto plano, por ejemplo vamos a trasmitir los digitos de una tarjeta de crédito a través de una página web de compras y necesitamos tener certeza de que si la comunicacion es interceptada, la información no tenga validez para quien ha capturado el dato.

Suponemos que tenemos en el texto plano M, la información numerica que queremos encriptar para ello realizamos la siguiente operación:

C ≡Me (mod n)

Con lo que C es el mensaje a enviar desde A a B, este último recibe un mensaje que no entiende y por loi tanto necesita obtener el texto plano inicial, ha de aplicar por lo tanto la clave privada para poder obtenerlo, mediante la operación:

M ≡Cd (mod n)

Como podemos ver los dos procesos realizan operaciones de exponenciación modular, que se implementa en tiempo polinomial

Las dificultades del sistema estriban en varios puntos:

  • Obtener dos números primos grandes, hay que generar números enteros aleatorios y realizar sobre estos test de primalidad, estos números han de ser tales que la factorización de su producto sea muy dificil (en tiempo se entiende).
  • Mantener en secreto los parámetros de la clave privada, que sólo ha de poseer B. 
  • Conocimientos de programación para implementar el algoritmo (o confiar en las cajas negras )
 Sobre este tema continuaremos ...






No hay comentarios:

Publicar un comentario