Criptografía asimétrica en OpenSSL - Llave encriptada
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.