RSA | algoritmo usted para cifrar y descifrar mensajes
RSA (Rivest-Shamir-Adleman) es un algoritmo utilizado por los ordenadores modernos para cifrar y descifrar mensajes. Es un algoritmo criptográfico asimétrico. Asimétrico significa que hay dos claves diferentes. También se denomina criptografía de clave pública, porque una de las claves puede entregarse a cualquiera. La otra clave debe mantenerse en privado. El algoritmo se basa en el hecho de que encontrar los factores de un número compuesto grande es difícil: cuando los factores son números primos, el problema se denomina factorización primaria. También es un generador de pares de claves (clave pública y privada).
El RSA implica una clave pública y una clave privada. La clave pública puede ser conocida por todo el mundo: se utiliza para cifrar los mensajes. Los mensajes cifrados con la clave pública sólo pueden descifrarse con la clave privada. La clave privada debe mantenerse en secreto. Calcular la clave privada a partir de la clave pública es muy difícil.
Conceptos utilizados
RSA utiliza una serie de conceptos de la criptografía:
- Una función unidireccional que es fácil de calcular; encontrar una función que la invierta o calcular esta función es muy difícil.
- El RSA utiliza un concepto llamado logaritmo discreto. Este funciona de forma muy parecida al logaritmo normal: La diferencia es que sólo se utilizan números enteros y, en general, interviene una operación de módulo. Como ejemplo ax =b, módulo n. El logaritmo discreto consiste en encontrar la x más pequeña que satisface la ecuación, cuando se proporcionan a b y n
- El algoritmo de Shor puede contrarrestarlo.
Generación de claves
Las claves para el algoritmo RSA se generan de la siguiente manera:
- Elija dos grandes números primos aleatorios diferentes y . Esto debe mantenerse en secreto.
- Calcule .
- es el módulo de la clave pública y de las claves privadas.
- Calcule el totiente: ϕ .
- Elija un número entero tal que , y e es coprimo a ϕ ( n .
es decir: y ϕ ( n ) no comparten más factores que : ; Ver máximo común divisor. - se libera como el exponente de la clave pública.
- Calcula para satisfacer la relación de congruencia .
Es decir: para algún número entero . (Simplemente decir: Calcular para que sea un número entero) - se mantiene como exponente de la clave privada.
Notas sobre los pasos anteriores:
- Paso 1: Los números pueden ser probados probabilísticamente para la primalidad.
- Paso 3: cambiado en PKCS#1 v2.0 a λ en lugar de ϕ .
- Paso 4: Una elección popular para los exponentes públicos es e = 2 . Algunas aplicaciones eligen valores más pequeños como e = 3 {\displaystyle , , o 35 en su lugar. Esto se hace para que el cifrado y la verificación de la firma sean más rápidos en dispositivos pequeños como las tarjetas inteligentes, pero los exponentes públicos pequeños pueden conllevar mayores riesgos de seguridad.
- Los pasos 4 y 5 pueden realizarse con el algoritmo euclidiano ampliado ; véase la aritmética modular.
La clave pública está formada por el módulo .
La clave personal está formada por p,q y el exponente privado (o de descifrado) d que debe mantenerse en secreto.
- Para mayor eficacia, se puede almacenar una forma diferente de la clave privada:
- y : los primos de la generación de la clave;
- y : a menudo llamados dmp1 y dmq1;
- : a menudo llamado iqmp.
- Todas las partes de la clave privada deben mantenerse en secreto en esta forma. p {\displaystyle y q son sensibles ya que son los factores de , y permiten el cálculo de dado . Si y no se almacenan en esta forma de la clave privada, entonces se eliminan de forma segura junto con otros valores intermedios de la generación de la clave.
- Aunque esta forma permite un descifrado y una firma más rápidos mediante el uso del Teorema Chino del Resto (TCR), es considerablemente menos segura, ya que permite los ataques de canal lateral . Esto es un problema particular si se implementa en tarjetas inteligentes, que son las que más se benefician de la mejora de la eficiencia.
(Empezar con , y deja que la tarjeta lo descifre. Entonces calcula o , cuyos resultados dan algún valor . Ahora, induzca un error en uno de los cálculos. Entonces revelará o .)
Mensaje de encriptación
Alice da su clave pública
a Bob y mantiene su clave privada en secreto. Bob quiere enviar el mensaje a Alice.Primero convierte
en un número menor que utilizando un protocolo reversible acordado conocido como esquema de relleno. A continuación, calcula el texto cifrado correspondiente:
Esto puede hacerse rápidamente utilizando el método de exponenciación por cuadrado. A continuación, Bob envía
a Alice.Desencriptación del mensaje
Alicia puede recuperar
de utilizando su clave privada en el siguiente procedimiento:Dado
, puede recuperar los números primos originales distintos, aplicando el teorema del resto chino a estas dos congruencias se obtiene.
Así,
.
Por lo tanto:
Un ejemplo de trabajo
He aquí un ejemplo de cifrado y descifrado RSA. Los números primos utilizados aquí son demasiado pequeños para permitirnos encriptar algo de forma segura. Puede utilizar OpenSSL para generar y examinar un par de claves real.
1. Escoja dos números primos aleatorios y :
y ;
2. Calcule :
;
3. Calcule el totiente ϕ :
;
4. Elija coprima a :
;
5. Elija para satisfacer :
, con .
La clave pública es ( , ). Para un mensaje acolchado la función de cifrado se convierte en:
La clave privada es (
, ). La función de descifrado se convierte:
Por ejemplo, para encriptar , calculamos
Para descifrar
, calculamos
Ambos cálculos pueden ser computados rápida y fácilmente utilizando el algoritmo de cuadrado y multiplicación para la exponenciación modular.
Derivación de la ecuación RSA a partir del teorema de Euler
El RSA puede derivarse fácilmente utilizando el teorema de Euler y la función totiente de Euler.
Empezando por el teorema de Euler,
debemos demostrar que al descifrar un mensaje cifrado, con la clave correcta, se obtendrá el mensaje original. Dado un mensaje acolchado m, el texto cifrado c, se calcula mediante
Sustituyendo en el algoritmo de descifrado, tenemos
Queremos demostrar que este valor también es congruente con m. Los valores de e y d se eligieron para satisfacer,
Es decir, existe algún número entero k, tal que
Ahora sustituimos en el mensaje encriptado y descifrado,
Aplicamos el teorema de Euler y obtenemos el resultado.
Esquemas de relleno
Cuando se utiliza en la práctica, el RSA debe combinarse con algún tipo de esquema de relleno, para que ningún valor de M dé lugar a textos cifrados inseguros. El RSA utilizado sin relleno puede tener algunos problemas:
- Los valores m = 0 o m = 1 siempre producen textos cifrados iguales a 0 o 1 respectivamente, debido a las propiedades de la exponenciación.
- Cuando se encripta con exponentes de encriptación pequeños (por ejemplo, e = 3) y valores pequeños de la m, el resultado (no modular) de puede ser estrictamente menor que el módulo n. En este caso, los textos cifrados pueden descifrarse fácilmente tomando la raíz et del texto cifrado sin tener en cuenta el módulo.
- El cifrado RSA es un algoritmo de cifrado determinista. No tiene ningún componente aleatorio. Por lo tanto, un atacante puede lanzar con éxito un ataque de texto plano elegido contra el criptosistema. Pueden hacer un diccionario encriptando probables textos planos bajo la clave pública, y almacenando los textos cifrados resultantes. El atacante puede entonces observar el canal de comunicación. En cuanto vean textos cifrados que coincidan con los de su diccionario, los atacantes podrán utilizar este diccionario para conocer el contenido del mensaje.
En la práctica, los dos primeros problemas pueden surgir cuando se envían mensajes ASCII cortos. En dichos mensajes, m puede ser la concatenación de uno o más caracteres codificados en ASCII. Un mensaje consistente en un único carácter ASCII NUL
(cuyo valor numérico es 0) se codificaría como m = 0, lo que produce un texto cifrado de 0 independientemente de los valores de e y N que se utilicen. Del mismo modo, un solo carácter ASCII SOH (cuyo valor numérico es 1
) produciría siempre un texto cifrado de 1. Para los sistemas que utilizan convencionalmente valores pequeños de e, como 3, todos los mensajes de un solo carácter ASCII codificados utilizando este esquema serían inseguros, ya que el mayor m tendría un valor de 255, y 2553 es menor que cualquier módulo razonable. Tales textos planos podrían recuperarse simplemente tomando la raíz cúbica del texto cifrado.
Para evitar estos problemas, las implementaciones prácticas de RSA suelen incrustar alguna forma de relleno estructurado y aleatorio en el valor m antes de cifrarlo. Este relleno garantiza que m no entre en el rango de los textos planos inseguros, y que un mensaje dado, una vez acolchado, se cifrará en uno de un gran número de posibles textos cifrados. Esta última propiedad puede aumentar el coste de un ataque de diccionario más allá de las capacidades de un atacante razonable.
Estándares como el PKCS han sido cuidadosamente diseñados para acolchar de forma segura los mensajes antes del cifrado RSA. Como estos esquemas acolchan el texto plano m con algún número de bits adicionales, el tamaño del mensaje sin acolchar M debe ser algo menor. Los esquemas de relleno RSA deben diseñarse cuidadosamente para evitar ataques sofisticados. Esto puede resultar más fácil si se cuenta con una estructura de mensaje predecible. Las primeras versiones del estándar PKCS utilizaban construcciones ad-hoc, que más tarde se descubrió que eran vulnerables a un práctico ataque de texto cifrado elegido adaptativo. Las construcciones modernas utilizan técnicas seguras como el relleno de cifrado asimétrico óptimo (OAEP) para proteger los mensajes y evitar al mismo tiempo estos ataques. El estándar PKCS también cuenta con esquemas de procesamiento diseñados para proporcionar seguridad adicional a las firmas RSA, por ejemplo, el Esquema de Firma Probabilística para RSA (RSA-PSS).
Firmar mensajes
Supongamos que Alicia utiliza la clave pública de Bob para enviarle un mensaje cifrado. En el mensaje, ella puede decir que es Alice, pero Bob no tiene forma de verificar que el mensaje procede realmente de Alice, ya que cualquiera puede utilizar la clave pública de Bob para enviarle mensajes cifrados. Así que, para verificar el origen de un mensaje, también se puede utilizar RSA para firmar un mensaje.
Supongamos que Alicia desea enviar un mensaje firmado a Bob. Ella produce un valor hash del mensaje, lo eleva a la potencia de d mod n (igual que cuando descifra un mensaje), y lo adjunta como "firma" al mensaje. Cuando Bob recibe el mensaje firmado, eleva la firma a la potencia de e mod n (igual que al cifrar un mensaje), y compara el valor hash resultante con el valor hash real del mensaje. Si ambos coinciden, sabe que el autor del mensaje estaba en posesión de la clave secreta de Alice, y que el mensaje no ha sido manipulado desde entonces.
Tenga en cuenta que los esquemas de relleno seguro, como el RSA-PSS, son tan esenciales para la seguridad de la firma de los mensajes como lo son para la encriptación de los mismos, y que nunca debe utilizarse la misma clave tanto para la encriptación como para la firma.
Preguntas y respuestas
P: ¿Qué es la RSA?
R: RSA (Rivest-Shamir-Adleman) es un algoritmo utilizado por los ordenadores modernos para cifrar y descifrar mensajes. Es un algoritmo criptográfico asimétrico.
P: ¿Qué significa asimétrico?
R: Asimétrico significa que hay dos claves diferentes: una clave pública y una clave privada.
P: ¿En qué se basa el algoritmo RSA?
R: El algoritmo se basa en el hecho de que encontrar los factores de un número compuesto grande es difícil - cuando los factores son números primos, este problema se llama factorización primaria.
P: ¿Cómo funciona el RSA?
R: RSA implica una clave pública y una clave privada. La clave pública puede ser conocida por todo el mundo: se utiliza para cifrar los mensajes. Los mensajes cifrados con la clave pública sólo pueden descifrarse con la clave privada, que debe mantenerse en secreto. Calcular la clave privada a partir de la clave pública es muy difícil.
P: ¿Existe algún otro nombre para este tipo de criptografía?
R: Este tipo de criptografía también se denomina criptografía de clave pública porque una de las claves puede entregarse a cualquiera mientras que la otra se mantiene privada.
P: ¿Genera RSA un par de claves?
R: Sí, RSA genera un par de claves - una clave pública y otra privada - que se utilizan para el cifrado y el descifrado respectivamente.