Seguridad

Generar par de claves RSA con OpenSSL (privada y pública)

En el corto tutorial de hoy vamos a ver cómo generar una clave pública y privada para el sistema criptográfico RSA.

Técnicamente hablando usaremos openssl para generar una clave privada RSA y luego vamos a derivar la clave pública de esta misma.

Generando clave privada

Para generar una clave privada usamos genrsa indicando el archivo en donde la clave será guardada y la longitud en bits.

Por ejemplo:

openssl genrsa -out clave_privada.pem 3072

Eso generará una clave privada RSA en el archivo clave_privada.pem de 3072 bits.

En este caso la salida es algo así (yo comparto la clave privada porque no la usaré para otra cosa, tú nunca compartas la tuya y si lo haces genera otra):

-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

Recuerda que esa clave fue guardada en clave_privada.pem, ahora vamos a derivar la pública. Con el ejemplo:

openssl rsa -in clave_privada.pem -pubout -out clave_publica.pem

En este caso la clave de entrada es clave_privada.pem y vamos a colocar la clave pública en clave_publica.pem. El archivo tiene el siguiente contenido:

-----BEGIN PUBLIC KEY-----
MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvn02Fu+stJGZ9MjSjdHE
qHWfvg7zqOuw4BHRTLP2iYUUuv5yzWBJC5g6Kt6nvUSVUuwdggSOvvH3vP8AVNSG
6dM8HEBfXFO5KYbOY2JKoY6tkU37xNWzFS03W24V95kZRUslgFo6xFxVCxqcHkhc
SmwcofYO1fs71gWIiW3yPhB/ZvX6YEGp/0zFYPdRiOAbKCyIhnv5zbEw8jhKYEf7
EaUjy7o1TdiVn1Gd5S6z8k1AChDgkDOtFY0bqqdDtN2/hM0dFdJZ+ifH6SL+Obc3
VPbkNGI93C8KqCaTU3W/pDrh5Kbu3KiMmZOPjiCnXZpIUYQnLKw7zfvwccESwUuR
52LeytM9UUnu03QIAqfmqWC206xGqPSGWgxhNCP9dzjm9y3URfJzFV3i8HAR9/7q
1uQKcwDUjp0ES4joaO3UKjizMLEM9clfU8xXvumf6gAupjxQolwhfiBK9nEPrnNR
tzsFhoDzMFKVWQwIMrTEEkX3O0Fa73SEXSSWYcI5EAXLAgMBAAE=
-----END PUBLIC KEY-----

Y con eso has generado un par de claves RSA. Ahora puedes encriptar usando criptografía asimétrica o firmar algo de manera digital.

Recuerda que nunca debes compartir tu clave privada, esa debe estar en un lugar seguro. Tampoco debes reutilizar claves, y si has expuesto una, mejor vuelve a generar el par.

Por cierto, entre más bits más seguridad pero necesitarás más poder de procesamiento.

Con OpenSSL versión 3

A partir de la versión 3 de OpenSSL, el formato por defecto para las claves privadas es el PKCS#8. Si tú quieres mantener el formato anterior PKCS#1 puedes convertir la clave generada así:

openssl pkey -in clave_privada.pem -traditional -out clave_privada_tradicional.pem

La diferencia entre PKCS 1 y 8, es que para el caso de PKCS#1 su encabezado comienza con —–BEGIN RSA PRIVATE KEY—–, pero en el caso de PKCS#8 su encabezado comienza con —–BEGIN PRIVATE KEY—–. Básicamente la diferencia es el “RSA”.

Para el caso de la clave pública, una vez que haya sido derivada de la clave privada en formato PKCS#8, ejecuta:

openssl rsa -pubin -in clave_publica.pem -RSAPublicKey_out -out clave_publica_tradicional.pem

Te repito que esto es solo para cuando necesitas el par de clave específicamente en PKCS#1, ya que el PKCS#8 es mejor.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.