RSA: Qué es y cómo funciona el cifrado de clave pública

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.



Cómo funciona RSA (visión general)

RSA se basa en operaciones aritméticas con enteros grandes y en la dificultad práctica de factorizar un número grande en sus factores primos. El esquema básico consta de tres etapas principales:

  • Generación de claves: se crean dos claves relacionadas matemáticamente: una pública y otra privada.
  • Cifrado: quien quiere enviar un mensaje convierte el mensaje en un número y lo eleva a una potencia usando la clave pública, tomando el resto módulo n.
  • Descifrado: quien posee la clave privada aplica otra potencia módulo n para recuperar el mensaje original.

Generación de claves (pasos y fórmulas)

De forma resumida, los pasos para generar un par de claves RSA son:

  • Elegir dos números primos grandes p y q de forma aleatoria y segura.
  • Calcular n = p × q. El valor n es parte de la clave pública y también del par de claves.
  • Calcular φ(n) = (p − 1) × (q − 1) (la función totiente de Euler para n cuando p y q son primos).
  • Elegir un entero e tal que 1 < e < φ(n) y gcd(e, φ(n)) = 1 (es decir, e es coprimo con φ(n)). e será el exponente público.
  • Calcular d como el inverso multiplicativo de e módulo φ(n): d ≡ e^(−1) (mod φ(n)). d es el exponente privado.

La clave pública es el par (n, e). La clave privada es el par (n, d) y debe mantenerse secreta.

Fórmulas de cifrado y descifrado

  • Para cifrar un mensaje m (convertido previamente a un número 0 <= m < n): c = m^e mod n.
  • Para descifrar el cifrado c: m = c^d mod n.

Estas operaciones se realizan con exponenciación modular eficiente (por ejemplo, exponenciación rápida) incluso cuando n tiene miles de bits.

Ejemplo numérico pequeño (didáctico)

Con fines ilustrativos (no seguro en la práctica):

  • Elegir p = 61 y q = 53 → n = 61 × 53 = 3233.
  • φ(n) = (61−1)(53−1) = 3120.
  • Elegir e = 17 (gcd(17,3120)=1).
  • Calcular d = 2753 (porque 17 × 2753 ≡ 1 (mod 3120)).
  • Clave pública: (n=3233, e=17). Clave privada: (n=3233, d=2753).
  • Si m = 65, cifrado: c = 65^17 mod 3233 = 2790. Descifrado: m = 2790^2753 mod 3233 = 65.

Este ejemplo muestra el mecanismo; en sistemas reales se usan primos de cientos o miles de bits.

Firmas digitales con RSA

RSA también se usa para firmas digitales. En lugar de cifrar con la clave pública, se aplica la clave privada al mensaje (o a un resumen/huella del mensaje):

  • Firma s = H(m)^d mod n (donde H(m) es un hash del mensaje y normalmente se usa un esquema de padding firmado como PSS).
  • Verificación: calcular v = s^e mod n y comprobar que v coincide con H(m).

Esto autentica que quien firmó posee la clave privada y que el mensaje no ha sido alterado.

Prácticas y consideraciones de seguridad

  • Tamaños de clave: en la práctica se recomiendan claves de al menos 2048 bits hoy en día; para seguridad a más largo plazo se usan 3072 o 4096 bits.
  • Padding obligatorio: nunca cifrar mensajes arbitrarios sin esquema de padding. Para cifrado se usan esquemas como OAEP; para firmas, PSS. El padding evita ataques de texto plano conocido o escogido.
  • Generador de números aleatorios fuerte: la seguridad depende de la calidad de p y q; deben generarse con un buen RNG criptográfico.
  • Protección de la clave privada: almacenar la clave privada cifrada (por ejemplo en un módulo HSM o usando cifrado con contraseña fuerte), y limitar su acceso.
  • Rotación de claves y revocación: establecer políticas para cambiar claves y revocarlas si se sospecha compromiso.
  • Vulnerabilidades: ataques prácticos incluyen factorización (cuando claves débiles), ataques de canal lateral (timing, consumo de energía), y problemas por mal uso del padding. Además, un ordenador cuántico suficientemente grande rompería RSA (algoritmo de Shor).

Uso real y rendimiento

RSA se usa ampliamente en protocolos como TLS/HTTPS, S/MIME, firmas de código y certificados X.509. Debido a que las operaciones RSA son más lentas que los cifrados simétricos, con frecuencia se utiliza RSA para cifrar o intercambiar una clave simétrica (por ejemplo, AES) y luego cifrar los datos con ese algoritmo simétrico más rápido.

Buenas prácticas resumidas

  • Usar claves de tamaño adecuado (mínimo 2048 bits en la actualidad).
  • Aplicar esquemas de padding seguros (OAEP para cifrado, PSS para firmas).
  • Generar primos con fuentes de entropía seguras y proteger la clave privada en hardware cuando sea posible.
  • Actualizar y rotar claves según políticas de seguridad y considerar alternativas resistentes a la criptografía cuántica a medio-largo plazo.

RSA sigue siendo uno de los esquemas de criptografía de clave pública más utilizados y estudiados. Su seguridad práctica depende tanto de elecciones matemáticas correctas (primos grandes, exponentes adecuados) como de la implementación y el entorno operativo (protección contra fugas, padding y buenas prácticas de gestión de claves).

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:

  1. Elija dos grandes números primos aleatorios diferentes {\displaystyle p} y q . Esto debe mantenerse en secreto.
  2. Calcule {\displaystyle n=pq} .
    • n es el módulo de la clave pública y de las claves privadas.
  3. Calcule el totiente: ϕ {\displaystyle \phi (n)=(p-1)(q-1)} .
  4. Elija un número entero {\displaystyle e} tal que {\displaystyle 1<e<\phi (n)} , y e {\displaystyle e} es coprimo a ϕ ( n {\displaystyle \phi (n)} .
    es decir:
    {\displaystyle e} y ϕ ( n ) {\displaystyle \phi (n)} no comparten más factores que {\displaystyle 1}: {\displaystyle \gcd(e,\phi (n))=1} ; Ver máximo común divisor.
    • {\displaystyle e} se libera como el exponente de la clave pública.
  5. Calcula {\displaystyle d} para satisfacer la relación de congruencia {\displaystyle de\equiv 1\!\!\!\!{\pmod {\phi (n)}}} .
    Es decir:
    {\displaystyle de=1+x\cdot \phi (n)} para algún número entero x . (Simplemente decir: Calcular {\displaystyle d=(1+x\cdot \phi (n))/e} para que sea un número entero)
    • {\displaystyle d} 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 λ {\displaystyle \lambda (n)={\rm {lcm}}(p-1,q-1)} en lugar de ϕ {\displaystyle \phi (n)=(p-1)(q-1)} .
  • Paso 4: Una elección popular para los exponentes públicos es e = 2 {\displaystyle e=2^{16}+1=65537} . Algunas aplicaciones eligen valores más pequeños como e = 3 {\displaystyle {\displaystyle e=3}, {\displaystyle 5}, o 35 {\displaystyle 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 [es]; véase la aritmética modular.


 La clave pública está formada por el módulo {\displaystyle n\,} {\displaystyle e\,} .
La clave personal está formada por p,q y el exponente privado (o de descifrado) d {\displaystyle d\,} que debe mantenerse en secreto.

  • Para mayor eficacia, se puede almacenar una forma diferente de la clave privada:
    • {\displaystyle p} y q : los primos de la generación de la clave;
    • {\displaystyle d{\bmod {(}}p-1)} y {\displaystyle d{\bmod {(}}q-1)} : a menudo llamados dmp1 y dmq1;
    • {\displaystyle q^{-1}{\bmod {p}}} : a menudo llamado iqmp.
  • Todas las partes de la clave privada deben mantenerse en secreto en esta forma. p {\displaystyle {\displaystyle p\,} y q {\displaystyle q\,} son sensibles ya que son los factores de {\displaystyle n\,} , y permiten el cálculo de {\displaystyle d\,} dado {\displaystyle e\,} . Si {\displaystyle p\,} y {\displaystyle q\,} 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 [es]. 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
    {\displaystyle y\equiv x^{e}\!\!\!\!{\pmod {n}}}, y deja que la tarjeta lo descifre. Entonces calcula {\displaystyle (y^{d}{\bmod {p}})} o {\displaystyle (y^{d}{\bmod {q}})}, cuyos resultados dan algún valor {\displaystyle z} . Ahora, induzca un error en uno de los cálculos. Entonces {\displaystyle \gcd(z-x,n)} revelará {\displaystyle p} o q .)


 

Mensaje de encriptación

Alice da su clave pública {\displaystyle (n,e)} a Bob y mantiene su clave privada en secreto. Bob quiere enviar el mensaje {\displaystyle M} a Alice.

Primero convierte {\displaystyle M} en un número m menor que n utilizando un protocolo reversible acordado conocido como esquema de relleno. A continuación, calcula el texto cifrado {\displaystyle c\,} correspondiente:

{\displaystyle c=m^{e}\mod {n}}

Esto puede hacerse rápidamente utilizando el método de exponenciación por cuadrado. A continuación, Bob envía {\displaystyle c\,} a Alice.



 

Desencriptación del mensaje

Alicia puede recuperar {\displaystyle m\,} de {\displaystyle c\,} utilizando su clave privada {\displaystyle d\,} en el siguiente procedimiento:

Dado {\displaystyle m\,} , puede recuperar los números primos originales distintos, aplicando el teorema del resto chino a estas dos congruencias se obtiene

{\displaystyle m^{ed}\equiv m{\bmod {pq}}} .

Así,

{\displaystyle c^{d}\equiv m{\bmod {n}}} .

Por lo tanto:

{\displaystyle m=c^{d}\ mod\ n}

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 {\displaystyle p} y {\displaystyle q\,} :

{\displaystyle p=61} y {\displaystyle q=53\,} ;

2. Calcule {\displaystyle n=pq\,} :

{\displaystyle n=61\times 53=3233\!} ;

3. Calcule el totiente ϕ {\displaystyle \phi (n)=(p-1)(q-1)} :

{\displaystyle \phi (n)=(61-1)(53-1)=3120\!} ;

4. Elija {\displaystyle e>1} coprima a {\displaystyle 3120\,} :

{\displaystyle e=17\,} ;

5. Elija {\displaystyle d\,} para satisfacer {\displaystyle ed\equiv 1{\bmod {\phi (n)}}} :

{\displaystyle d=2753\,} , con {\displaystyle 17\times 2753=46801=1+15\times 3120} .


 La clave pública es ( {\displaystyle n=3233} , {\displaystyle e=17} ). {\displaystyle c=m^{e}{\bmod {n}}}Para un mensaje acolchado {\displaystyle m\,} la función de cifrado se convierte en:

{\displaystyle c=m^{17}{\bmod {3}}233\,}

La clave privada es ( {\displaystyle n=3233} , {\displaystyle d=2753} ). La función de descifrado {\displaystyle m=c^{d}{\bmod {n}}} se convierte:

{\displaystyle m=c^{2753}{\bmod {3}}233\,}


 Por ejemplo, para encriptar {\displaystyle m=123}, calculamos

{\displaystyle c=123^{17}{\bmod {3}}233=855}

Para descifrar {\displaystyle c=855}, calculamos

{\displaystyle m=855^{2753}{\bmod {3}}233=123}

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,

{\displaystyle m^{\phi (n)}\equiv 1{\pmod {n}}}

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

{\displaystyle c\equiv m^{e}{\pmod {n}}}

Sustituyendo en el algoritmo de descifrado, tenemos

{\displaystyle c^{d}\equiv (m^{e})^{d}\equiv m^{ed}{\pmod {n}}}

Queremos demostrar que este valor también es congruente con m. Los valores de e y d se eligieron para satisfacer,

{\displaystyle ed\equiv 1{\pmod {\phi (n)}}}

Es decir, existe algún número entero k, tal que

{\displaystyle ed=k\times \phi (n)+1}

Ahora sustituimos en el mensaje encriptado y descifrado,

{\displaystyle {\begin{aligned}m^{ed}&\equiv m^{k\phi (n)+1}\\&\equiv m\times m^{k\phi (n)}\\&\equiv m\times \left(m^{\phi (n)}\right)^{k}{\pmod {n}}\end{aligned}}}

Aplicamos el teorema de Euler y obtenemos el resultado.

{\displaystyle m\times (1)^{k}\equiv m{\pmod {n}}}



 

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 {\displaystyle m^{e}} 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.

AlegsaOnline.com - 2020 / 2025 - License CC3