Idioma: Español

tools / rsa

rsa/

Cifra con una clave pública RSA y descifra con la privada, o cifra con la privada y descifra con la pública. El relleno, el formato de la clave, el formato de entrada y salida y el juego de caracteres son configurables, y tus claves nunca salen del navegador.

Texto plano

Clave

Texto cifrado

Historial

Cada cifrado o descifrado correcto se guarda automáticamente. Se conservan los últimos 20, solo en el navegador de este dispositivo. Las claves nunca se guardan, pero sí el texto plano descifrado, así que en un equipo compartido borra el historial al terminar.

AES, DES y RSA: qué son y en qué se diferencian

AES y DES son cifrados simétricos: la misma clave cifra y descifra, como una llave que sirve tanto para cerrar como para abrir una puerta. Son rápidos y adecuados para grandes cantidades de datos; lo difícil es hacerle llegar esa clave al otro lado de forma segura.

DES es un estándar antiguo de los años 70 con una clave efectiva de solo 56 bits, que hoy se puede romper por fuerza bruta con hardware especializado o clústeres de equipos, así que solo sirve para conectar con sistemas antiguos que todavía lo usan. AES sustituyó a DES como estándar. Usa claves de 128, 192 o 256 bits, hoy no tiene ningún ataque práctico y es la opción por defecto para cifrar datos.

RSA es asimétrico: hay un par de claves. La clave pública se puede dar a cualquiera y sirve para cifrar; la clave privada la guardas tú y sirve para descifrar, como un buzón en el que cualquiera puede echar cartas pero que solo tú puedes abrir. No hace falta acordar una clave compartida de antemano, pero RSA es lento y solo puede cifrar unos cientos de bytes cada vez. Los sistemas reales suelen combinar ambos: RSA cifra una clave AES generada al azar para el otro lado, y AES cifra los datos reales.

¿Cuántos datos puede cifrar RSA de una vez?

RSA solo puede cifrar un bloque pequeño de datos cada vez, limitado por el tamaño de la clave y el relleno. Con PKCS1Padding el límite es el tamaño de la clave en bytes menos 11, es decir, 245 bytes para una clave de 2048 bits. Con OAEP es el tamaño de la clave en bytes menos el doble de la longitud del hash menos 2, es decir, 190 bytes para una clave de 2048 bits con SHA-256. Los datos más largos suelen cifrarse con AES, y RSA se usa para cifrar la clave AES.

Equivalencias con los nombres de Cipher de Java

Los nombres del relleno coinciden con los de Cipher de Java: para RSA/ECB/PKCS1Padding elige PKCS1Padding; para RSA/ECB/OAEPWithSHA-256AndMGF1Padding elige la tercera opción, ya que Java usa SHA-1 para MGF1 por defecto; si defines hashes personalizados con OAEPParameterSpec, elige OAEPPadding y escoge por separado el hash de OAEP y el hash de MGF1. Los juegos de caracteres también siguen las reglas de Java; por ejemplo, UTF-16 se codifica en big-endian con un FE FF al principio.

¿Por qué el texto cifrado es distinto cada vez?

Al cifrar con una clave pública, tanto PKCS1Padding como OAEP añaden bytes aleatorios al relleno, así que el mismo texto da un texto cifrado distinto cada vez, y todos se descifran con la clave privada. Es lo esperado. El cifrado con clave privada usa un relleno fijo, así que su resultado es siempre el mismo. OAEP solo sirve para cifrar con clave pública y descifrar con clave privada.

Formatos de clave admitidos

Las claves PEM pueden ser BEGIN PUBLIC KEY, BEGIN RSA PUBLIC KEY, BEGIN PRIVATE KEY o BEGIN RSA PRIVATE KEY, y también puedes pegar solo el cuerpo en Base64. Una clave hex es el mismo contenido en hexadecimal. Las claves privadas protegidas con contraseña hay que descifrarlas antes. Con el tipo de clave en clave pública también puedes pegar una clave privada, y se usará su parte pública.

Preguntas frecuentes

¿Qué hago cuando el descifrado falla con «la clave no corresponde, el tipo de clave o el relleno son incorrectos»?

Comprueba tres cosas por orden. Primero, si la clave es el par de la clave pública usada para cifrar, ya que lo cifrado con una clave pública solo lo abre su clave privada correspondiente. Segundo, el tipo de clave debe ser clave privada. Tercero, el relleno debe coincidir con el del lado que cifró; con OAEPPadding, el hash de OAEP y el hash de MGF1 también deben coincidir. Por último, confirma el formato de entrada, porque confundir hex y base64 también hace fallar el descifrado.

¿Qué hago cuando se rechaza el formato de la clave o dice que CERTIFICATE no se admite?

Primero asegúrate de que «Formato de la clave» coincide con lo que pegaste: elige pem para un texto que empieza por -----BEGIN y hex para una cadena larga de hexadecimal; cuando no coincide, normalmente aparece un mensaje que indica a cuál cambiar. El PEM debe contener una clave pública o privada RSA, y un certificado (BEGIN CERTIFICATE) no se puede usar directamente; puedes extraer antes la clave pública con openssl x509 -in cert.pem -pubkey -noout. Cuando se pegan juntos un certificado y una clave, el bloque de la clave se selecciona automáticamente.

Mi clave privada tiene contraseña y dice que la descifre primero. ¿Qué hago?

Las claves privadas protegidas con contraseña no se admiten (BEGIN ENCRYPTED PRIVATE KEY, o una línea Proc-Type: 4,ENCRYPTED en la cabecera del PEM). Quita antes la contraseña en tu propio equipo y luego pega la clave, por ejemplo con openssl rsa -in archivo-original -out archivo-nuevo, introduciendo la contraseña cuando te la pida. El archivo resultante es una clave privada sin protección, así que trátalo con cuidado cuando termines.

Dice que el contenido supera el límite. ¿Cuántos caracteres chinos puedo cifrar?

El límite cuenta bytes, no caracteres. Una clave de 2048 bits con PKCS1Padding admite como máximo 245 bytes, y un carácter chino ocupa 3 bytes en UTF-8, así que unos 81 caracteres; con el juego de caracteres GBK ocupa 2 bytes, así que unos 122. Al cifrar, tras pegar una clave, el panel Clave muestra «máx. N bytes por cifrado» para la clave y el relleno actuales. Si te pasas, da un error, y la herramienta no divide el contenido en bloques automáticamente.

¿Cómo descifro datos cifrados con JSEncrypt o con Web Crypto en el navegador?

JSEncrypt usa PKCS1Padding y produce Base64, así que elige aquí PKCS1Padding y pon el formato de entrada en base64. RSA-OAEP de Web Crypto del navegador usa un único hash tanto para OAEP como para MGF1, así que elige aquí OAEPPadding y pon el hash de OAEP y el hash de MGF1 con el mismo valor, por ejemplo SHA256 en ambos. En los dos casos pon el tipo de clave en clave privada.

¿Qué significa que «el texto cifrado es más largo que la clave» o que está «fuera de rango para esta clave»?

El texto cifrado RSA mide lo mismo que la clave en bytes: 256 bytes para una clave de 2048 bits, que son 512 caracteres en hex, y nunca más. Al descifrar, el panel Clave muestra «Texto cifrado de N bytes» junto a su título; compáralo con el recuento de bytes que aparece junto a la entrada. Un texto cifrado más largo que la clave suele significar un formato de entrada equivocado o contenido copiado de más; un valor fuera de rango significa que el texto cifrado no se cifró con la clave pública pareja de esta clave, así que cambia a la clave correcta.

¿Se puede usar el cifrado con clave privada y el descifrado con clave pública para firmar y verificar?

No directamente. El cifrado con clave privada de aquí solo aplica la clave privada a tu entrada con PKCS1Padding y no calcula ningún hash, mientras que una firma como SHA256withRSA calcula primero el hash de los datos y luego lo envuelve en una estructura fija (DigestInfo). Por eso, al descifrar aquí con la clave pública una firma estándar, obtienes esa estructura, no el texto original. Para firmar o verificar, usa una biblioteca o herramienta que admita algoritmos como SHA256withRSA.

¿Qué guarda el historial y se sube a algún sitio?

Solo existe en el localStorage del navegador de este dispositivo y nunca se sube; el código de la página no hace ninguna petición de red. Se añade un registro tras cada cifrado o descifrado correcto, se conservan hasta 20, y no se guarda nada cuya entrada o resultado supere los 20 000 caracteres. Cada registro contiene los parámetros, la entrada y el resultado, además de una huella de 8 caracteres derivada de la clave (los primeros 8 caracteres hex del SHA-256 del módulo, que aparecen después de # en cada registro y sirven para saber si es la misma clave), pero nunca la clave en sí, así que tras pulsar «Cargar» tienes que pegar la clave de nuevo. El texto plano descifrado se guarda, así que en un equipo compartido pulsa «Borrar historial» al terminar.