Cifrar / descifrar RSA — RSA-OAEP, PSS y PKCS#1 v1.5
Cifrar / descifrar RSA
Genere pares de claves RSA en el navegador, cifre y descifre con RSA-OAEP, firme con RSA-PSS o PKCS#1 v1.5, y convierta claves entre los formatos PEM SPKI, PKCS#8 y PKCS#1. Todo se ejecuta localmente con el motor WebCrypto — ninguna clave ni mensaje sale nunca de esta página.
Para qué sirve RSA: mensajes pequeños y firmas, no datos masivos. RSA cifra como máximo k−2·hashLen−2 bytes por llamada (190 bytes para una clave de 2048 bits con SHA-256) y es unas 1000× más lento que AES. Los sistemas reales usan cifrado híbrido: RSA envuelve una clave AES aleatoria, y AES cifra los datos (vea la herramienta AES). Esta página existe para aprender, probar y comprobar la interoperabilidad.
1. Generar un par de claves(WebCrypto, en local; los cuatro formatos PEM se producen juntos)
Tamaño del módulo:
Clave pública — SPKI(-----BEGIN PUBLIC KEY-----, el formato habitual de «clave pública RSA»)
Clave pública — PKCS#1(-----BEGIN RSA PUBLIC KEY-----, módulo y exponente sin envoltorio)
Clave privada — PKCS#8(-----BEGIN PRIVATE KEY-----, sin cifrar; trátela como una contraseña)
Clave privada — PKCS#1(-----BEGIN RSA PRIVATE KEY-----, el formato clásico de OpenSSL)
Generar una clave en el navegador no la cifra. Para almacenarla, muévala a un almacén de claves real o cífrela sin conexión.
2. O importe una clave existente(pegue cualquiera de los cuatro formatos PEM)
3. Cifrar / descifrar (RSA-OAEP)- la dirección sigue a la clave actual: pública = cifrar, privada = descifrar
Hash:Etiqueta:
El cifrado PKCS#1 v1.5 no se implementa a propósito: no tiene integridad del cifrado y cae ante los ataques de oráculo de relleno (Bleichenbacher). OAEP es el único modo de cifrado que debe usar un diseño nuevo.
4. Firmar (requiere la clave privada)- PSS (aleatorizado, moderno) o PKCS#1 v1.5 (determinista, compatible con sistemas antiguos)
Esquema:Hash:
5. Verificar (requiere la clave pública)- pegue el mensaje y la firma
Esquema:Hash:
¿Cuánto puede transportar una llamada RSA?Límite de mensaje OAEP = bytes de la clave − 2×bytes del hash − 2:
Módulo
SHA-256
SHA-384
SHA-512
1024 bits
62 bytes
30 bytes
0 bytes
2048 bits
190 bytes
126 bytes
62 bytes
3072 bits
318 bytes
254 bytes
190 bytes
4096 bits
446 bytes
382 bytes
318 bytes
Las firmas no tienen límite de mensaje — el mensaje se hashea primero; la firma en sí siempre tiene exactamente el tamaño de la clave (256 bytes para 2048 bits).
Fortaleza y vida útil de la clave(NIST SP 800-57 Parte 1 Rev. 5): los 1024 bits se prohibieron para uso nuevo desde 2013; 2048 bits es el mínimo actual y sigue siendo aceptable hasta 2030; 3072 bits o más es la opción cómoda para 2031 en adelante. 8192 bits funciona aquí, pero la generación puede tardar un minuto o más en el navegador y aporta una seguridad que hoy nadie necesita — prefiera 3072/4096.
Interoperabilidad con OpenSSL — los PEM que produce esta página hacen el viaje de ida y vuelta por línea de comandos: openssl pkeyutl -encrypt -pubin -inkey pub.pem -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256 openssl pkeyutl -decrypt -inkey priv.pem -pkeyopt rsa_padding_mode:oaep ... openssl dgst -sha256 -sign priv.pem -out msg.sig msg.txt (PKCS#1 v1.5) / openssl dgst -sha256 -verify pub.pem -signature msg.sig msg.txt PSS: añada -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 a ambas llamadas a dgst. Conversión de formato de clave: openssl rsa -in key.pem -RSAPublicKey -out pubkey.pem convierte SPKI ↔ PKCS#1 en disco; esta página lo hace en el navegador.
Autocomprobación Ejecuta el motor de la página frente a anclas independientes: generación de claves con tres tamaños de módulo, viajes de ida y vuelta de cifrado/descifrado OAEP, firma/verificación PSS y PKCS#1 v1.5 con distintos hashes, un vector de firma v1.5 determinista byte a byte (generado por una implementación nativa independiente), un cifrado OAEP fijo y una firma PSS producidos por OpenSSL que esta página debe descifrar/verificar (interoperabilidad entre implementaciones), viajes de ida y vuelta de conversión de formato PEM, y pruebas negativas (una firma alterada o una clave incorrecta deben fallar). Nada se envía a ninguna parte.
Cifrado y firmas RSA explicados desde cero
En una frase: RSA es criptografía de clave pública: cualquiera puede cifrarle con la clave pública o verificar sus firmas, pero solo la clave privada puede descifrar o firmar — y su seguridad descansa en que factorizar un número de 2048 bits en dos primos está fuera del alcance de cualquier computadora que exista.
Qué calcula RSA realmente
Dos primos y una puerta trampa. Una clave RSA empieza con dos primos grandes y aleatorios p y q; su producto n (el módulo, de ahí «clave de 2048 bits») se publica en la clave pública junto con un exponente e (casi siempre 65537). La clave privada es el par d, el inverso modular de e − calculado a partir de p y q — más atajos derivados de los primos que aceleran las operaciones con la clave privada hasta 4×.
Cifrar y firmar son la misma exponenciación. Cifrar un bloque de mensaje m significa calcular me mod n; descifrar es cd mod n. Firmar un bloque ya formateado con el exponente privado y verificar con el público es la misma operación en el otro sentido. Todo lo demás de esta página — OAEP, PSS, PKCS#1 — trata de formatear ese bloque de forma segura para que nunca quede expuesta la exponenciación cruda.
Por qué es lento. Una operación RSA con una clave de 2048 bits cuesta del orden de un millón de veces más de CPU que cifrar un bloque con AES. Por eso TLS usa RSA (o ECC) solo para acordar una clave AES aleatoria, y después cambia. La misma regla se aplica a todo lo que construya: RSA para la clave, AES para los datos.
Tamaño de clave. La longitud del módulo es el mando de seguridad: 1024 bits está roto por política (factorizarlo está al alcance de los estados), 2048 bits ≈ 112 bits de fortaleza simétrica, 3072 bits ≈ 128 bits, y 15360 bits igualaría una clave simétrica de 256 bits. Nota sobre poscuántica: el algoritmo de Shor rompe RSA sin más en una computadora cuántica grande — una razón más para mantener vidas útiles de clave finitas.
OAEP: el único relleno de cifrado que debe usar
El problema del RSA crudo. El RSA de libro (me mod n sobre el mensaje en bruto) es determinista y maleable: mensajes idénticos se cifran igual, un atacante puede multiplicar un cifrado por el cifrado de 2 para que el texto plano se duplique, y los mensajes cortos caen con el ataque de encuentro a mitad de camino. Nunca debe usarse directamente.
Qué hace OAEP. OAEP (PKCS#1 v2, RFC 8017) mezcla el mensaje con una semilla aleatoria a través de una red de Feistel basada en hash antes de la exponenciación. El resultado: el cifrado es aleatorizado (el mismo texto plano da un cifrado distinto cada vez — ejecute dos veces el ejemplo OAEP y compare), la manipulación se detecta al descifrar, y el mensaje debe caber dentro del módulo con espacio para el hash — el límite k−2·hashLen−2 tabulado arriba.
La etiqueta. Una cadena pública opcional que se une al relleno. Ambos lados deben indicar exactamente la misma etiqueta o el descifrado falla — como el AAD de AES-GCM, permite vincular el cifrado a un contexto (un nombre de archivo, un identificador de algoritmo). Lo normal es que esté vacía.
El cifrado PKCS#1 v1.5 está ausente a propósito. El relleno de la época de 1993 no tiene integridad y filtra información a través del comportamiento de error del descifrado (el ataque de Bleichenbacher de 1998 convierte un oráculo de relleno en descifrado completo con unos pocos millones de cifrados elaborados; todavía rompe sistemas reales como ROBOT, 2017). WebCrypto se niega a implementarlo; esta página también.
Firmas PSS frente a PKCS#1 v1.5
Firmar = hashear, luego rellenar, luego exponenciar. Ambos esquemas hashean el mensaje (SHA-256/384/512 aquí), formatean el resumen en un bloque y aplican el exponente privado. Verificar vuelve a formatear el bloque con la clave pública y compara. La diferencia está en el formateo:
Esquema
Contenido del bloque
Propiedades
RSASSA-PKCS1-v1_5
resumen + cabecera digest-info, determinista
Cada firma del mismo mensaje es idéntica byte a byte (compruebe la autocomprobación: su vector v1.5 es fijo). Soporte heredado universal: certificados X.509, JWT RS*, TLS anterior a 1.3. No se conoce ninguna falsificación si la verificación se implementa correctamente.
RSA-PSS
resumen + sal aleatoria de la longitud del hash, enmascarado MGF1
Aleatorizado: cada firma difiere. Seguro demostrablemente en el modelo de oráculo aleatorio; exigido en los certificados de TLS 1.3 y en protocolos más recientes. El verificador debe conocer la longitud de la sal (esta página usa la longitud del hash, el valor predeterminado habitual).
Cuál elegir. Diseños nuevos: PSS. Interoperabilidad con certificados existentes, JWT (RS256) o sistemas antiguos: v1.5. Ambos son seguros como esquemas de firma — la historia del desastre v1.5 trata del *relleno de cifrado*, una construcción distinta a pesar del nombre parecido.
PKCS#1 frente a PKCS#8 frente a SPKI: por qué la misma clave tiene cuatro PEM
PEM es solo DER envuelto en base64. Un archivo PEM es una etiqueta más el base64 de una estructura DER (ASN.1 binario). La etiqueta indica qué estructura es — y esa es toda la diferencia entre los cuatro formatos que genera esta página:
Etiqueta PEM
Estructura DER
Contiene
-----BEGIN PUBLIC KEY-----
SubjectPublicKeyInfo (SPKI)
OID del algoritmo + clave pública (n, e). La «clave pública» predeterminada en todas partes.
-----BEGIN RSA PUBLIC KEY-----
PKCS#1 RSAPublicKey
Solo (n, e). OpenSSL antiguo y algunas pilas embebidas.
-----BEGIN PRIVATE KEY-----
PKCS#8 PrivateKeyInfo
OID del algoritmo + clave privada. Contenedor independiente del algoritmo, el valor moderno predeterminado.
-----BEGIN RSA PRIVATE KEY-----
PKCS#1 RSAPrivateKey
n, e, d, p, q, …. La salida clásica de genrsa de OpenSSL.
La misma clave, envoltorios distintos. Las cuatro cajas de arriba tras Generar contienen el mismo par de claves — SPKI y la pública PKCS#1 contienen los mismos n y e; la privada PKCS#8 y la PKCS#1 contienen los mismos valores privados. Esta página convierte entre ellos sin pérdidas en el navegador (su autocomprobación hace ida y vuelta de las conversiones). Confundir los formatos es la causa más habitual de errores de «clave no válida» al pegar claves entre herramientas.
Los PEM cifrados (-----BEGIN ENCRYPTED PRIVATE KEY-----) son PKCS#8 con una capa de cifrado basada en contraseña. Esta página no los acepta — descífrelos antes sin conexión (openssl pkcs8 -in enc.pem -out plain.pem).
Errores habituales
Cifrar datos masivos con RSA. Más allá del límite estricto de tamaño de OAEP, es absurdamente lento. El patrón es: generar una clave AES aleatoria, cifrar la clave AES con RSA-OAEP, cifrar los datos con AES-GCM y enviar ambas partes.
Distribuir la clave privada porque «es una prueba». Las claves de ejemplo incrustadas en los vectores de esta página se publican a propósito — solo pueden firmar datos de prueba. Sus claves no son así.
Verificar con la clave privada. Suele «funcionar» matemáticamente y algunas herramientas lo permiten, pero distribuir una clave privada a los verificadores anula todo el modelo. Verifique con la clave pública (esta página lo exige).
Comparar firmas byte a byte para comprobar código. PSS (y OAEP) son aleatorizados: dos ejecuciones correctas producen salidas distintas. Compare verificando, no por igualdad — solo las firmas v1.5 son deterministas.
Claves de 1024 bits «porque son más rápidas». También están al alcance de una factorización con mucho presupuesto. El argumento de la velocidad murió con el cifrado híbrido: RSA se ejecuta una vez por sesión, no por byte.
Fijar una longitud de sal distinta de la del hash para PSS. El verificador debe estar de acuerdo; la longitud del hash (la elección de esta página y -sigopt rsa_pss_saltlen:32 de OpenSSL) es el valor predeterminado interoperable.
Preguntas frecuentes
¿Por qué falló mi descifrado con «clave incorrecta, hash incorrecto o cifrado corrupto»? El descifrado OAEP falla si ocurre cualquiera de estas cosas: no es la clave privada correspondiente, el hash difiere del lado que cifró, la etiqueta difiere o cambió un byte del cifrado. El error es deliberadamente idéntico en todos los casos — revelar qué comprobación falló ya es en sí una filtración por oráculo de relleno.
¿Puedo obtener la clave pública a partir de la privada? Sí — los formatos privados también contienen n y e. Esta página muestra ambos tras Generar; OpenSSL lo hace con openssl pkey -in priv.pem -pubout.
¿Por qué 65537 como exponente? Es primo, tiene solo dos bits a 1 (exponenciación rápida) y es lo bastante grande como para evitar los ataques de exponente bajo que afectan a e=3. Es la elección estándar desde los años noventa; un exponente «raro» suele indicar una clave débil o no estándar.
¿Está muerto RSA por las computadoras cuánticas? Todavía no — no existe ninguna máquina que pueda ejecutar el algoritmo de Shor sobre un módulo de 2048 bits. Pero los datos que deben seguir secretos hasta los años 2030 ya se están migrando; los esquemas híbridos poscuánticos son la respuesta de ingeniería.
¿Qué pasa con openssl rsautl? Es el antecesor obsoleto de pkeyutl. Por defecto usa el relleno de cifrado v1.5 — una razón más por la que se retiró.