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 )
No hay comentarios:
Publicar un comentario