Criptografía simétrica en OpenSSL - Algoritmos de cifrado

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

OpenSSL es una librería que implementa los protocolos de seguridad web SSL (secure sockets layer), TLS (transport layer security) y otra serie de operaciones como la criptografía simétrica. Esta serie de operaciones y protocolos tienen como objetivo proteger la seguridad de la información entre dos partes. El código fuente de esta librería puede ser descargado en la página oficial de openssl en www.openssl.org. Existen versiones compiladas para cada distribución de Linux, basta buscar en el package search de tu distribución preferida. Una distribución específica para windows puede encontrarse aquí.

Lo primero que tal vez te preguntes al escuchar SSL, TLS  u OpenSSL es para qué sirve esto ?. La gama de utilidades de OpenSSL en particular es bastante amplia. Sin embargo, para que te hagas una idea los Certificados SSL de los sitios web, aquellos que cuando ingresas aparece en verde la barra de navegación y comienza con HTTPS, son creados con OpenSSL. Otro uso muy extendido (que también incluye los certificados del primer ejemplo) es la firma digital de documentos.

Primeros pasos

Vamos a ver el primer comando del command line tool para ver qué versión de OpenSSL tenemos:

openssl version
OpenSSL 1.1.0g  2 Nov 2017

Por otra parte, la serie de comandos de OpenSSL puede verse ejecutando el siguiente comando:

openssl help

El cuál mostrará una salida similar a la siguiente:

16_1

Algoritmos de encriptación de llave secreta

En la imagen anterior podrás ver una sección que lista los comandos de crifrado (cipher commands) los cuales hacen referencia a los diferentes algoritmos de encriptación disponibles. No todos los comandos de cifrado incluyen llave secreta. Por ejemplo, si observas a detalle la lista encontrarás la conocida codificación base64. Esta combinación crea un string en ASCII utilizando letras mayúsculas, minúsculas, números y los caractéres +=/. Veamos el siguiente ejemplo:

touch myfile.txt
echo "123456789" > myfile.txt
openssl enc -base64 -in myfile.txt

Con esto, creamos un archivo llamado myfile.txt, agregamos el string "123456789" al contenido del archivo y obtenemos su cifrado en base64 el cuál debe arrojar el siguiente resultado:

MTIzNDU2Nzg5Cg==

AES

Ahora viene lo interesante, utilicemos el algoritmo AES, en modo CBC,  y una llave de 256 bits para encriptar el mensaje "Hola mundo".

touch mymessage.txt
echo "Hola mundo" > mymessage.txt
openssl enc -aes-256-cbc -in mymessage.txt -out encrypted.bin

Con esto, creamos el archivo mymessage.txt y guardamos en él el texto "Hola mundo". Enseguida ejecutamos el comando para encriptar con llave secreta el cuál nos solicitara la clave con la cuál se encriptará la información.

enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:

La llave secreta es creada deacuerdo al password que ingresemos en la consola. El producto de este comando es el archivo encriptado encrypted.bin el cuál es un archivo binario. Para obtener el mensaje original desde este archivo basta ejecutar el siguiente comando:

openssl enc -aes-256-cbc -d -in encrypted.bin -pass pass:MYPASSWORD

Debes reemplazar MYPASSWORD por la contraseña con la que encriptaste el archivo. Este sistema encriptación es utilizado en la criptografía simétrica dado que utiliza solo una llave para encriptar y desencriptar mensajes.

DES

El algoritmo DES es el predecesor de AES. Para utilizar este algoritmo y todos los demás en la lista se debe seguir la misma métrica del comando.

openssl enc -des -in mymessage.txt -out encrypted.bin

Y para desencriptar:

openssl enc -des -d -in encrypted.bin -pass pass:MYPASSWORD

Bien, esto es lo más básico de OpenSSL, espero que puedas utilizar estos comandos para encriptar uno que otro mensaje o información a tu disposición. Hasta la próxima.


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.