Desde siempre ha existido la preocupación por asegurar la privacidad en las comunicaciones, intentado garantizar que un mensaje sólo pudiera ser leído por el receptor al que iba destinado. Imaginar el reto que puede suponer mantener este nivel de privacidad en el mundo actual en el que vivimos en donde se hace un uso masivo e intensivo de las comunicaciones digitales a través de internet. La criptografía juega un papel fundamental para alcanzar este objetivo, ayudándonos a establecer comunicaciones seguras mediante la aplicación de algoritmos y protocolos de seguridad.

En este artículo aprenderemos a realizar algunas operaciones criptográficas elementales como generar un par de claves, cifrar y descifrar mensajes y verificar que los datos de un mensaje no han sido alterados. Para ello vamos a utilizar RSA, como algoritmo de cifrado asimétrico y OpenSSL.

RSA

RSA es un algoritmo de cifrado asimétrico, por lo que trabaja a partir de dos claves, una pública y otra privada. Se trata de uno los algoritmos más utilizados en la actualidad. De hecho, la mayor parte de los sitios web hoy corren sobre SSL/TLS, y permiten la autenticación mediante cifrado asimétrico basado en RSA.

RSA sirve para cifrar y descifrar información, y por ello también provee servicios de autenticidad y de integridad, mediante lo que se conoce cono Infraestructura de clave pública (PKI)

OpenSSL

OpenSSL es un kit de herramientas para los protocolos de Seguridad de la capa de transporte (TLS) y de Capa de sockets seguros (SSL). También es una biblioteca de criptografía de propósito general. OpenSSL tiene una licencia de estilo Apache, lo que significa que eres libre de obtenerla y usarla con fines comerciales y no comerciales. Puedes descargar el código fuente de esta librería en su página oficial www.openssl.org.

Para comprobar la versión de OpenSSL que tienes instalada, abre la línea de comandos e introduce:

$ openssl version

Y si quieres consultar todos los comandos que puedes ejecutar con OpenSSL:

$ openssl help

Llegados a este punto, comencemos con la parte práctica.

1. Cómo generar de un par de claves

Antes de cifrar o descifrar mensajes necesitamos generar un par de claves. Este par está compuesto por una clave pública, que podemos poner a disposición de todos, y una clave privada,que debemos mantener en secreto. Cuando alguien quiera enviarnos algún mensaje y asegurarse de que nadie más pueda verlo, puede usar nuestra clave pública para cifrarlo.

Lo primero de todo será generar una clave privada RSA:

$ openssl genrsa –out private_key.pem 2048 

Este comando que acabas de ejecutar crea una clave RSA de 2,048 bits llamada «private_key.pem«. El nombre de la clave se especifica después de la marca «-out» y, por lo general, termina en «.pem«. El número de bits se especifica con el último argumento, en nuestro caso 2048. Para consultar la clave privada que acabamos de generar:

$ cat private_key.pem

A continuación, generaremos la clave pública a partir de la clave privada que acabamos de generar:

$ openssl rsa -in private_key.pem -outform PEM -pubout -out public_key.pem

Para ver la clave pública que acabas de generar:

$ cat public_key.pem

Recuerda que cuando se cifran los datos de un mensaje con una clave pública, nadie puede descifrarlo a menos que tenga su clave privada.

2. Cifrar y descifrar mensajes

Una vez hemos generado nuestro par de claves, vamos a utilizarlas para cifrar un mensaje con la clave pública y descifrarlo con la privada. Para ello, vamos a crear un archivo de texto llamado “secret.txt” con un texto que sólo podrá ser leído por un usuario autorizado.

$ echo 'Este es un mensaje secreto' > secret.txt

A continuación, introduce el siguiente comando para cifrar el archivo con la clave pública:

$ openssl rsautl -encrypt -pubin -inkey public_key.pem -in secret.txt -out secret.enc

Este comando ha generado el archivo «secret.enc«, que es una versión cifrada de «secret.txt«. Como podrás imaginar, si intentamos abrir el archivo que acabamos de generar, veremos que la información aparece distorsionada:

Para descifrar el fichero “secret.enc” y recuperar el contenido original, utilizaremos nuestra clave privada

$ openssl rsautl -decrypt -inkey private_key.pem -in secret.enc

3. Hash y firma digital

Lo siguiente que haremos será crear un hash de un mensaje y luego firmarlo digitalmente. Para ello utilizaremos el algoritmo hash SHA256. A continuación, verificaremos dicha firma para asegurarnos que el mensaje no se modificado ni falsificado. Si se modificara el mensaje, el hash sería diferente al firmado y por tanto la verificación no sería correcta.

Para crear un hash del mensaje introduce el siguiente comando:

$ openssl dgst -sha256 -sign private_key.pem -out secret.txt.sha256 secret.txt

Este comando generará un archivo llamado «secret.txt.sha256» con nuestra clave privada, que incluye el hash del archivo de texto secreto. Con este archivo, cualquiera puede usar la clave pública y el hash para verificar que el archivo no se haya modificado desde que se creó y cifró. Para realizar esta verificación, utiliza el siguiente comando:

$ openssl dgst -sha256 -verify public_key.pem -signature secret.txt.sha256 secret.txt

Se mostrará el siguiente resultado indicando que la verificación se realizó correctamente y que ningún tercero malicioso modificó el archivo

Si se muestra otro resultado, quiere decir que se modificó el contenido del archivo, y es probable que ya no sea seguro.

Referencias

Si te gustó, comparte este artículo

About the Author:

Arquitecto software interesado en todo lo relacionado con la tecnología, el marketing digital, las habilidades humanas y el desarrollo personal.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.