El blog de Ariel Costas

Por qué romper el cifrado es una mala idea

Durante los últimos años, muchos gobiernos han intentado romper o prohibir el cifrado punto a punto con la excusa de tratar de “prevenir el terrorismo”. Sin embargo, no solo es esta medida estúpida, sino que es solo otro intento de poder espiar todas las conversaciones privadas de los ciudadanos.

The guardian publicó hace algunas horas El Reino Unido puede obligar a los servicios de Facebook a permitir puertas traseras para la policía. Hablemos de como este cifrado punto a punto funciona, por qué es una idea terrible romperlo y como comunicarse de forma privada si esta medida falla (la primera norma es no fiarte de Facebook).

Por qué no debemos romper el cifrado

El cifrado es la mejor forma de comunicarse sin ningún tercero sabiendo de lo que estás hablando. Si eres un indivíduo, puedes estar hablando sobre lo que quieres comprar, buscar síntomas de alguna enfermedad que podrías tener o quejarte de lo malo que es tu gobierno.

¡Esto es terrible! Significa que en el mejor de los casos solo recibirás anuncios de cosas que quieres comprar, en el segundo, significa que tu seguro privado de salud te subirá el precio “por si acaso” (esto no pasa en Europa, pero en EE.UU. aún confías en seguros privados). Y en el último caso, el gobierno puede ser totalitario e intentar ponerte entre rejas por hablar en su contra (como en China y otras dictaduras).

Como comunicarse de forma privada

La solución es cifrado+firmas PGP. Esta tecnología se basa en claves públicas, donde existen dos claves: una pública y otra privada, protegida por una passphrase y permisos sespeciales en el sistema operativo.

Con tu clave privada firmas, para que cualquiera pueda leer tu mensaje y saber que procede de tí. Esta firma es innegable, con lo que no puedes decir “yo no he enviado eso”, porque significaría que alguien obtuvo acceso a tu clave privada y passphrase.

Con la clave pública cifras, con lo que solo la persona con la clave privada puede leer el mensaje. Esto es probablemente lo que más quieres, porque es una garantía de que nadie por medio puede conocer el contenido del mensaje, incluso si es enviado por un canal no seguro.

Un ejemplo

Pongamos un ejemplo de dos personas: A y B; también conocidas como Alice y Bob. Quieren comunicarse de forma privada, así que generan cada uno un par de claves (una pública y otra privada). Luego, intercambian sus claves a través de un medio seguro, con el que saben que tienen la clave correcta.

Alice quiere mandar un mensaje a Bob, con lo que debe cifrar el mensaje con la clave pública de Bob, para que solo él pueda leerlo. Pero aquí llega el primer problema: ¿como sabe Bob que el mensaje lo mandó Alice y no alguien que se hace pasar por ella? La solución es sencilla: Alice firmará primero su mensaje con su clave privada, y ese mensaje firmado lo cifrará con la clave pública de Bob. Y así, señoras y señores, es como funciona el cifrado punto a punto.

Pero nos hemos saltado algo, ¿como se intercambian las claves? La forma ideal sería reunirse físicamente con una memoria USB (o similar) e intercambiar la clave de ese modo. Pero muchas veces esto no es viable porque la gente se comunica a grandes distancias. Otra forma es simplemente publicarla en alguna página web o servidor de llaves, y que la otra persona se la descargue e importe a su gestor de claves (como GnuPG).

Como hacer esto en la vida real

Vale, los ejemplos están bien, pero… ¿Como hago esto? Bueno, lo primero es generar tu par de claves. Para eto, voy a usar GnuPG (GPG), que suele estar incluído en las distribuciones de GNU+Linux (como Debian, Ubuntu o Fedora) y pueden descargarse para Windows y MacOS de https://gnupg.org/download/.

Generando y distribuyendo una clave

El primer paso es crear tu par de claves, para lo que se usa gpg --full-gen-key. Te preguntará el tipo de clave que quieres, que es RSA y RSA. Para el tamaño de la clave, puedes elegir el que prefieras, aunque se recomienda 3072 o 4096 bits. Luego, puedes especificar datos extra, y tendrás que introducir una passphrase. Esto es importante, porque quieres proteger la clave privada, y que no pueda ser usada por nadie que no seas tú.

Una vez tengas tu clave, puedes firmar mensajes para otros y cifrarlos para tí mismo. Pero para que los demás se puedan comunicar contigo, necesitan tu clave. Puedes exportar la clave pública con gpg --armor --export tu@correo.com. El parámetro –armor fuerza el uso de una armadura ASCII, con lo que puedes subirla a algún sitio o mandarla por correo sin problemas de codificación. Otro paso que puedes querer seguir es subirla a servidores de claves como https://keys.openpgp.org para que cualquiera pueda descargarla en su cliente.

Firmando mensajes

Ahora que tienes todo listo, puedes probar a firmar un mensaje. Primero, lo escribes enu un editor de texto (como Vim, Nano o Bloc de Notas; no Office). Tras guardarlo, puedes firmarlo usando gpg --armor --sign /path/al/archivo, y tras teclear tu passphrase encontrarás otro archivo en ese directorio que contiene el mensaje firmado, y con el mismo nombre con .asc al final. Esto es tu mensaje firmado, cualquier persona puede verificar innegablemente que ese mensaje fue enviado por tí.

Cifrando mensajes

Lo que querías hacer era mandar mensajes cifrados, con lo que necesitas también la clave pública de la otra persona. Digamos que tienen su clave en un keyserver, la descargaríamos utilizando gpg --keyserver https://elkeyserver.org --recv-keys elcorreo@detu.amigo remplazando –keyserver por el servidor. Y si está en un servidor HTTP normal, puedes descargarla con tu navegador y ejecutar gpg --import /path/a/la/clave/descargada o usar algo como cURL desde la terminal.

// recibir la clave y |pasarla| a GnuPG
curl -f https://lapagina.com/clave.gpg | gpg --import

Una vez tienes lel mensaje y la clave pública, procedes a cifrarlo con gpg --armor --sign --encrypt -r elcorreo@detu.amigo. Lo que le estás diciendo al programa es “Hey gpg, usa una armadura ASCII, firma el mensaje con mi clave y cífralo para quien tiene este correo”.

Intenta hacer esto con tu propio correo (el mismo que el de tu clave privada), encontrarás un archivo .asc, que descifrado con gpg --decryipt archivo.asc se verá similar al siguiente:

ariel@linux:~ $ gpg --decrypt test.asc
gpg: encrypted with 4096-bit RSA key, ID D0708A9C6729EEA1, created 2021-03-14
      "Ariel Costas <ariel@costas.dev>"
Hi there

this is a signed message for my blog post

Goodbye
gpg: Signature made Fri 02 Apr 2021 01:40:37 PM CEST
gpg:                using RSA key CC460CB965540CEABF6F237C0813EA757FA7AAE6
gpg: Good signature from "Ariel Costas <ariel@costas.dev>" [ultimate]

Esto confirma lo siguiente:

Conclusión

Es bastante sencillo comunicarse de un modo cifrado, ya sea para uso cotidiano o con fines maliciosos (no me hago responsable de eso). Lo que significa que romper el cifrado de aplicaciones como WhatsApp es inútil.

Queridos gobiernos que puedan estar leyendo esto, dejad de intentar utilizar excusas estúpidas para legalizar el espionaje sobre vuestros ciudadanos, esto no está bien. Todo el mundo tiene derecho a tener conversaciones privadas sin que el Estado las controle. Y para esos que apoyan romper el cifrado, os invito a publicar todos vuestros correos y mensajes intercambiados (“si no teneis nada que ocultar, no teneis nada que temer”, ¿no?).


Notas de traducción

  1. Cifrado en inglés es encryption, es incorrecto decir “encriptación”.
  2. Passphrase significa frase de contraseña
  3. Keyserver es lo mismo que servidor de claves, un servidor remoto que almacena claves públicas y permite a cualquiera buscarlas y descargarlas.