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.