OpenSSL: Cifrando un archivo simétricamente

En esta oportunidad haremos una breve introducción a la criptografía simétrica y asimétrica, y utilizaremos OpenSSL para cifrar archivos simétricamente.

Cuántas veces nos ha sido necesario pasarle esos datos privados a alguien por correo electrónico, y no estar seguros de si alguien «no autorizado» iba a poder acceder al contenido?

Aquí una breve explicación de cómo cifrar un archivo en GNU/Linux… por consola, como corresponde 🙂

Simétrico o asimétrico?

Existen dos tipos de criptografía, la simétrica y la asimétrica.

Criptografia simétrica

Cuando hablamos de criptografía simétrica hacemos referencia a todo el conjunto de algoritmos e implementaciones de software que permiten cifrar y descifrar la información utilizando solamente una clave de cifrado.
Así, por ejemplo, podríamos cifrar la porción de datos que quisiéramos, desde openssl111un archivo, hasta un fragmento de paquete de red, utilizando una clave, y nuestro destinatario podrá descifrarlo utilizando la misma clave.

De mas está decir que la clave de cifrado de un algoritmo simétrico deberá ser previamente intercambiada entre emisor y receptor. Este intercambio podría ser considerado el punto más débil de un intercambio de datos cifrados simétricamente.

El intercambio puede llevarse a cabo mediante mecanismos que implementen algoritmos como Diffie-Hellman. IKE (Internet Key Exchange) es un protocolo de intercambio de claves utilizado por IPSec para el establecimiento de sus túneles seguros de VPN, y es un ejemplo de implementación de Diffie-Hellman.

Criptografia asimétrica

A diferencia de la criptografía simétrica, la asimétrica hace uso de dos claves, una pública y una privada, y es por ello que también se la llama, junto con los mecanismos de cifrado y autenticación asimétricos,  Infraestructura de clave pública, o PKI por sus siglas en inglés.

Se basa en un par de claves en el cual solo existe una clave pública para una privada, y viceversa, de modo que no sería posible encontrar otra clave publica que se relacione con la privada, ni tampoco otra privada que se relacione con la pública del par. Además de esta condición, otra condición para la generación de claves, es que la clave privada nunca puede ser obtenida a partir de la clave pública, y esto es necesario para cualquier algoritmo asimétrico, ya que éstos métodos requieren el intercambio, por un medio hostil como Internet, de las claves públicas de los nodos de cifrado.

En cifrado asimétrico cada nodo dispone de las dos claves de cifrado, y pueden intercambiar libremente sus claves públicas, y así un nodo podrá cifrarle a otro utilizando la clave publica del destinatario, mientras que el destinatario podrá descifrar el contenido mediante su clave privada secreta. Es por esta razón que la clave privada debe ser protegida de cualquier extraño, puesto que quien la tenga podrá descifrar todo contenido, archivos o tráfico, destinado a su poseedor, y además, podrá autenticarse por su propietario original en cualquier servicio que utilice PKI y en el que haya estado registrado.

En este caso la ventaja es que las claves publicas pueden ser intercambiadas sin mediar ningún resguardo, y pueden intercambiarse directamente, o por medio de certificados digitales x509.

El criptosistema

En el siguiente esquema de criptosistema puede apreciarse más gráficamente.
Todo mensaje M para por un cifrador (E) para convertirse en un mensaje cifrado C. El cifrador requerirá una clave, proporcionada por el nodo origen, para cifrar el contenido plano.
El receptor recibe el mensaje ssl1C, lo descifra con un descifrador (D) y utilizando una clave k provista por el receptor, obteniendo el mensaje en texto plano original, M.

En cifrado simétrico, la clave k será igual en ambos extremos, mientras que en cifrado asimétrico, la clave k en el emisor será la clave pública del receptor, y k en el receptor será su propia clave privada.

Ejemplo de un cifrado simétrico simple utilizando openssl

Supongamos que tenemos un archivo con un contenido determinado, como el «hola mundo» del siguiente ejemplo.openssl

Podemos utilizar la suite openssl para cifrar simétrica y asimetricamente. En este ejemplo, un par de comandos para cifrado simétrico utilizando un algoritmo AES con claves de 128b y un modo de cifrado CBC (cipher block chaining).

Nos pedirá el openssl la contraseña para el cifrado, y luego al descifrarlo igual. La contraseña se utiliza, internamente, para generar un salt y una clave de cifrado de cierta longitud. En este caso, de 128 bits.

ssl2

Conclusiones

Hemos visto algunos conceptos básicos de criptografía, y hemos cifrado y descifrado un archivo utilizando openssl por línea de comandos.

Openssl no es la única herramienta de cifrado, y tampoco permite cifrar únicamente en forma simétrica. En posteriores entregas iremos analizando el cifrado asimétrico utilizando esta y otras herramientas, como GNUPG, con ejemplos e instructivos.

¡Espero les sirva! ¡Hasta la próxima!