martes, 22 de noviembre de 2016

Introducción a GPG - Cifrado Simétrico


Hace poco me he visto en la necesidad de cifrar algunos de mis archivos, concretamente los que suelo llevar en pendrives y que son de naturaleza delicada (documentos personales, del trabajo, etc.). En principio mi objetivo consistía únicamente en buscar una manera cómoda y rápida de cifrarlos y descifrarlos con una simple contraseña utilizando algún programa multiplataforma, para no estar anclado únicamente a Linux en caso de verme en un ordenador ajeno al mío.

Antes que nada, quiero aclarar que no me voy a parar a explicar la diferencia entre cifrado simétrico y asimétrico, ni los sistemas de clave pública en general. Ya existe información más que suficiente por internet que explica muy bien el objetivo y el contexto en el que se aplica cada uno.

Así que, tras realizar una búsqueda intensiva y recordar algunas asignaturas de la carrera, me he decidido a escribir una serie de artículos sobre criptografía. La razón de escribir varios y no uno solo es porque, si lo hiciese de esta forma, resultaría demasiado extenso y tardaría semanas en redactarlo.

De modo que, con el fin de poder ir ofreciendo contenido sin tanta demora entre artículos (probablemente soy el redactor de blog más lento del mundo), voy a centrarme aquí en los sistemas de cifrado simétrico. ¡Vamos allá!


¿Qué cifrado simétrico utilizar?


Aunque existen multitud de algoritmos de cifrado simétrico muy buenos, existe un consenso generalizado entorno a que AES (Rijndael) es el mejor de todos en lo que se refiere a seguridad, y por ello es utilizado por gobiernos y fuerzas militares de todo el mundo. Eso no quiere decir que otros algoritmos como TWOFISH o CAMELLIA no nos puedan servir, sino que actualmente, AES es el líder.

Teniendo esto claro, existen en Linux multitud de programas que nos pueden cifrar un archivo (¡hasta podríamos comprimirlo en un rar con contraseña y listo!), pero diría que si hay dos programas que destacan por encima de los demás, son claramente GNU Privacy Guard (GPG) y OpenSSL.

El primero es una implementación del estándar OpenPGP, mientras que el segundo es ampliamente conocido por ser utilizado especialmente en servidores web para proporcionar seguridad y cifrado bajo varios estándares como SSL (ya obsoleto) o TLS en las conexiones que se realizan.

Aunque OpenSSL puede cifrar bajo infinidad de algoritmos simétricos, las cabeceras que añade a los archivos cifrados suelen ser muy poco explicativas (ni siquiera incluyen el algoritmo con el que han sido cifrados), y tiene una implementación muy "casera", poco estandarizada y con ciertos fallos de seguridad que claramente no invitan a usarlo. Dejo en las referencias un enlace que explica esto con más detalle.

Optamos pues por GPG, el programa más utilizado del mundo para este propósito, además de utilizarse como alternativa a los certificados digitales expedidos por entidades certificadoras (como CERES), utilizando redes personales de confianza, que ya comentaré con más profundidad en el futuro.


Existen dos versiones de GnuPG


Lo primero que tenemos que saber es que actualmente existen dos versiones de GPG: 1.4 y 2.1. Si bien el paquete gpg viene preinstalado en la mayoría de distribuciones (la versión incluida en Ubuntu 16.04 es la 1.4.20), esta versión es en realidad antigua, y así se reconoce en la propia web del proyecto, en la que se especifica que está compilada con muy pocas dependencias externas, lo que la convierte en una buena opción para sistemas integrados con pocos recursos, pero a cambio recibe únicamente las actualizaciones más importantes y le faltan muchas de las opciones de las nuevas versiones. En general, no nos interesará usar esta versión de GPG.

Por otro lado, existe GnuPG 2.1, incluida en los repositorios de Ubuntu 16.04 como el paquete gnupg2. Esta versión, respecto a la antigua, proporciona soporte para S/MIME y gpg‑agent. Además, introduce la criptografía de curvas elípticas y elimina el anillo de claves privadas (secring.gpg) que poseía GPG 1.4, para delegar toda esa gestión al gpg‑agent. En las referencias he dejado un enlace en el que se explican todas las novedades de esta versión.


Comenzando con GnuPG


Vamos a abrir un terminal y a instalar el paquete correspondiente a GPG 2.1:

Como este artículo sólo pretende cubrir el cifrado simétrico, vamos a ver las opciones básicas para este cometido (aunque en el manual accesible desde el terminal podemos ver decenas de opciones).

En cuanto ejecutemos por primera vez gpg2 para cualquier tarea, este nos indicará que se ha creado la carpeta ~/.gnupg en nuestro directorio personal, así como algunos ficheros de configuración, siendo gpg.conf el más importante.

Bien, vayamos ahora al grano. Supongamos que tenemos un archivo a cifrar, mensaje.txt. La opción más rápida sería la siguiente:

La opción ‑‑symmetric, que se puede abreviar como sencillamente ‑c, nos preguntará por una contraseña para nuestro archivo, y automáticamente se generará en la misma carpeta un archivo binario mensaje.txt.gpg cifrado con AES.

Algunas de las opciones que más nos pueden interesar son:

  • ‑a, ‑‑armor : Cuando se cifra, en lugar de un archivo binario con extensión .gpg, se generará un fichero ASCII con extensión .asc codificado en base64. En consecuencia, el archivo cifrado generado ocupará más espacio.

  • ‑‑cipher‑algo : Especifica qué algoritmo de cifrado queremos utilizar. Por defecto es CAST5 en GnuPG 1.4 y AES 128 en GnuPG 2.1.

  • ‑‑compress‑algo : Especifica qué algoritmo de compresión queremos utilizar. El comportamiento por defecto de este algoritmo es el de mirar las preferencias del receptor del mensaje (cuando se utiliza una clave pública para cifrar). En caso de no especificarse preferencia alguna, o de trabajar con cifrado simétrico, se utiliza ZIP para maximizar la compatibilidad.

  • ‑d, ‑‑decrypt : Descifra el mensaje pasado como parámetro en la propia consola, a menos que se utilice junto con la opción ‑‑output.

  • ‑o, ‑‑output : Especifica cómo se llamará el archivo generado. Esta opción debe especificarse la primera de todas, antes que ninguna otra.

  • ‑c, ‑‑symmetric : Indica que queremos realizar un cifrado simétrico.

  • ‑‑version : Imprime información sobre la versión del programa, así como los algoritmos de cifrado simétricos y asimétricos soportados, los algoritmos de resumen (hash) y los tipos de compresión admitidos.

Veamos ahora un ejemplo más completo que el anterior, donde vamos a especificar que queremos un cifrado AES 256, una salida en fichero ASCII en lugar de binario, una compresión BZIP2 y que el archivo de salida se llame mensajecifrado.txt:

Para descifrar podemos utilizar conjuntamente las opciones ‑d y ‑o o bien podemos quitar la opción ‑o y en su lugar utilizar el operador >, así:


Cambiar los algoritmos por defecto


Ya he mencionado antes el archivo de configuración ubicado en ~/.gnupg/gpg.conf, donde podemos especificar varias opciones y preferencias respecto al comportamiento por defecto del programa.

Si lo abrimos, nos encontraremos con un archivo de algo más de 200 líneas, con decenas de opciones disponibles para comentar o descomentar. Ahora mismo solo nos interesa cambiar los algoritmos utilizados por defecto, no solo para cifrado simétrico, sino también para compresión y para hashing (que nos interesará a la hora de trabajar con firma electrónica).

Para ello, nos vamos al final del archivo y añadimos las tres siguientes líneas:


El orden en el que listamos los algoritmos indica la prioridad de cada uno. Esto será especialmente útil cuando trabajemos con cifrado asimétrico y alguien nos quiera enviar un mensaje, ya que, a menos que esa persona fuerce un algoritmo distinto, el mensaje que recibamos utilizará alguno de los que hemos marcado en las preferencias.

Específicamente, según la documentación oficial, cada opción indica lo siguiente:

  • personal‑cipher‑preferences : Establece la lista de algoritmos de cifrado preferidos. Esto permite sobrescribir de manera segura las preferencias respecto al algoritmo elegido por el receptor del mensaje (en caso de cifrado asimétrico, claro está), ya que GPG sólo utilizará un algoritmo que sea utilizable por todos los destinatarios.

    Además, el algoritmo con más prioridad de esta lista también se utiliza al realizar cifrado simétrico con la opción ‑‑symmetric.

  • personal‑digest‑preferences : El algoritmo con más prioridad de esta lista se utiliza al firmar, tal y como podemos hacer con las opciones ‑‑clearsign o ‑‑sign, que trataremos en el artículo de cifrado asimétrico.

    Teóricamente con esta lista establecemos nuestros algoritmos de resumen o hashing preferidos. Esto permitiría sobrescribir de manera segura las preferencias respecto al algoritmo elegido por el receptor del mensaje ya que GPG sólo utilizaría un algoritmo que fuera utilizable por todos los destinatarios. Lo que ocurre es que todo esto en realidad no sirve para absolutamente nada, porque cuando firmamos un mensaje, no seleccionamos un "receptor de la firma", por lo que las preferencias de una persona respecto a sus algoritmos de resumen son completamente ignoradas en la práctica.

    El único contexto en el que esta lista se podría aplicar hipotéticamente sería en el de una autenticación a un servidor (SSH por ejemplo), que nos requiriese la firma de un desafío y nos indicase qué algoritmo de hashing utilizar para dicha firma. Pero, en la práctica, la capacidad de autenticación de GPG no se utiliza.

  • personal‑compress‑preferences : Establece la lista de algoritmos de compresión preferidos. Esto permite sobrescribir de manera segura las preferencias respecto al algoritmo elegido por el receptor del mensaje ya que GPG sólo utilizará un algoritmo que sea utilizable por todos los destinatarios.

    Además, el algoritmo con más prioridad de esta lista también se utiliza cuando no hay destinatarios del archivo, como cuando utilizamos la opción ‑‑symmetric.

¡Y esto es todo por ahora! Ya hemos visto lo más relevante sobre los principios básicos del cifrado simétrico con GnuPG. En cuanto pueda, escribiré acerca del sistema de clave pública y privada, las firmas digitales y las redes de confianza. ¡Un saludo!


Referencias:
  • 7 Tools to Encrypt/Decrypt and Password Protect Files in Linux [Link]
  • GPG Encryption Guide - Part 4 (Symmetric Encryption) [Link]
  • GNU Privacy Guard Documentation [Link]
  • Hashing Algorithm: Is your GPG configuration secure? [Link]
  • How to change default cipher in GnuPG on both Linux and Windows? [Link]
  • OpenSSL vs GPG for encrypting off-site backups? [Link]
  • RFC 4880 - OpenPGP Message Format [Link]
  • The GNU Privacy Guard [Link]
  • What’s new in GnuPG 2.1 [Link]

2 comentarios:

  1. He puesto un link desde mi pagina a la tuya para ampliar conocimientos sobre cifrado con gpg. Te escribía para decirte y agradecerte muchos de tus artículos que los leo

    ResponderEliminar
    Respuestas
    1. Hola! Muchas gracias! Lamentablemente hace tiempo que no publico nada, no por falta de ideas, sino más bien de tiempo. A ver si retomo esto un poco y publico algo en los próximos meses. ¿Cuál es tu página por cierto?

      Un saludo!

      Eliminar