Criptografía asimétrica en OpenSSL - Llave encriptada

Author
By Darío Rivera
Posted on 2019-08-21 in OpenSSL
Tags   OpenSSL 1.1

En post anteriores hemos visto conceptualmente cómo funciona la criptografía asimétrica y cómo encriptar mensajes de dos formas distintas (con llave pública o privada) y con objetivos distintos (confidencialidad o autenticidad). Si aún no conoces de que va todo esto, en los siguientes enlaces podrás encontrar toda la información necesaria para estar al corriente de lo que veremos en el post del día de hoy.

- Criptografía asimétrica en OpenSSL - Llave pública
- Criptografía asimétrica en OpenSSL - Llave privada

Cómo ya hemos visto, el comando genrsa nos permite crear nuestra propia llave privada de la cuál se deriva la que también es nuestra llave pública. Sin embargo, qué sucede si se te ocurre guardar tu llave secreta en una usb stick y por cuestiones del destino te la roban o alguién más se hace con ella ?. Pues en el peor de los casos te roba tu identidad digital, esta persona podría enviar mensajes auténticos en nombre tuyo o descifrar aquellos que te han sido enviados y encriptados con tu llave pública. Cómo mejoramos la seguridad de nuestra llave privada para que no sea suceptible a este tipo de adversidades ?. La respuesta es encriptar nuestra llave privada

Cuando se protege una llave privada con un algoritmo de cifrado cada vez que se quiera encriptar o desencriptar un mensaje con esta llave se nos solicitará dicha clave. Esto significa que será de muy poca ayuda que alguien más posea nuestra llave privada encriptada puesto que no sabrá nuestro password. Veamos pues como encriptar nuestra llave privada. Pero antes que nada, generemos un par nuevo de llaves pública y privada.

Generación de las llaves

Para generar las llaves privada y pública podemos hacer uso de los siguientes comandos:

openssl genrsa -out key.pem 1024
openssl rsa -in key.pem -pubout -out pub-key.pem

Después de generar la llave pública (pub-key.pem) y privada (key.pem) podemos proceder a encriptar nuestra llave privada con una clave segura.

Encriptación de la llave privada

Para encriptar la llave privada vamos a hacer uso del algoritmo de cifrado triple des (3-des). Tú puedes utilizar el algoritmo de cifrado de tu preferencia, lo que importa realmente en este post es que el password de encriptación sea seguro. Uno de los algoritmos más utilizados y seguros es el AES128 (-aes128).

openssl rsa -in key.pem -des3 -out enc-key.pem

Enseguida se nos solicitará el password con el cuál será encriptada la llave privada.

writing RSA key
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

El producto final es el archivo enc-key.pem y su contenido será similar al que se muestra a continuación.

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,DF3ADE28E0C17D49

hLQq/7AQ0TD2NtrjOs0Nuoeaa+j/F0M0NH91WvwWBOaVENV8vn3Cbmbwm7fTaGsW
xJ+5qQBqNAJRWDo7tYbOr0Qp24qse4hQykhjHoqSEmeLq0sbkIYYWArErQjAwUJF
QvuTZjRBCZ6dMSd0qFMC/Cm398+Uy1rQf3RUN7Qc93da7IAX8b4lagH3Yutiy5oZ
Vczoz+5o9wauobb87Gb09SzYUVA0Y1S5u3yn9VtTNTov21/14Xsw5hAInmDnMOWR
acxmzSL5OiL/syysg5Qe6DCmbTlxbWyApZ9zsEQbGdZzO/5l9D1i5jWcFeo75HlY
bcyXxBql02GvQ0vwkV5ISA1fBcw73dkRiuq03zwg4Hf/G0od3u6PRVzU9+Dhmq9X
yy/EGx8VrW9fmO3qmbSq6OAjjvvpjnqfiup7PfWS2Sp4HxSi12yEuL9tHVYvXEea
t0dFF1KZfcN2nzq+0HXqtE/IZgqL2U4IkezNdSFit2/ATISDJsfPQmNkWwMC1L8X
CzOgD3zjERedhxQMVTCznZoEmsCWacfSJli98IoYsZyWBynS9IIJWcDOa54Ho4K2
p/VNSdyaCHDPkbEMhdbNELujGHs1JOi1tYTve5z8KNgiliBL/sc8yb7unoSZ3nqC
8s+DV/riL5kue3uQJFP9LLHhQSrbVQ1vZ5LJkAqHT6d5qyHXGlxqiuB2dIpPtMt7
RMAyJgVdZ07Z/QOOorv/S/I016tL+p38HW8Qv0p0NmIzdsdmfAeP9XUCdujN1jsk
LqTsaK62lrKbWgYrTucgDnDJF7eUzEsgvow6sgux5u0QC/V07nCZIw==
-----END RSA PRIVATE KEY-----

Encriptación con llave pública

Para encriptar un mensaje en el archivo message.txt con la llave pública pub-key.pem debemos utilizar el comando openssl rsautl con la opción -encrypt.

openssl rsautl -encrypt -inkey pub-key.pem -pubin -in message.txt -out message.enc

El producto de esta ejecución es el archivo message.enc el cuál podrá ser desencriptado con el mismo comando con la opción -decrypt.

openssl rsautl -decrypt -inkey enc-key.pem -in message.enc -out message.dec

El contenido del archivo message.dec contendrá el mensaje original. 

Encriptación con llave privada (encriptada)

Para encriptar un mensaje en el archivo message.txt con la llave privada enc-key.pem debemos utilizar el comando openssl rsautl con la opción -encrypt.

openssl rsautl -inkey enc-key.pem -in message.txt -sign > message.enc

El producto de esta ejecución es el archivo message.enc el cuál podrá ser desencriptado con el mismo comando de la siguiente manera utilizando nuestra llave pública.

openssl rsautl -inkey pub-key.pem -pubin -in message.enc -out message.dec

El contenido del archivo message.dec contendrá el mensaje original.


Si te ha gustado este artículo puedes invitarme a tomar una taza de café

Acerca de Darío Rivera

Author

Ingeniero de desarrollo en PlacetoPay , Medellín. Darío ha trabajado por más de 6 años en lenguajes de programación web especialmente en PHP. Creador del microframework DronePHP basado en Zend y Laravel.

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.