Actualmente, con el desarrollo de los medios de comunicación electrónicos, asistimos a un ingente intercambio de mensajes entre ciudadanos, tanto cercanos como lejanos geográficamente. Para la fiabilidad del sistema, es imprescindible que los intercambios sean seguros, que la privacidad de sus contenidos sea inviolable. WhatsApp es líder mundial en la mensajería instantánea con más de 100.000 millones de mensajes enviados al día. Cuando por primera vez iniciamos un intercambio de mensajes con otro usuario, en nuestra pantalla del teléfono móvil aparece un recuadro amarillo con el siguiente texto: Los mensajes y las llamadas están cifrados de extremo a extremo. Nadie de fuera de este chat, ni siquiera WhatsApp, puede leerlos ni escucharlo. Que sea de extremo a extremo significa que el cifrado y descifrado de los mensajes se realiza respectivamente en el propio teléfono móvil del emisor y del receptor, sin intermediarios. En este artículo mostramos como realiza WhatsApp su cifrado.
Comenzamos con una breve introducción a la criptografía. A lo largo de la historia se han utilizado diferentes sistemas de cifrado, pero esencialmente se tiene dos formas de encarar el cifrado de un texto: cambiar la posición de las letras y sustituir las letras del mensaje por otras. En los sistemas simétricos, el cifrado y descifrado de los mensajes se guía por una misma clave secreta, que solo deben compartir el emisor y el receptor del mensaje. Así, junto con la utilización de un sistema de cifrado que sea difícil de romper, la comunicación secreta debe conllevar una forma segura de intercambio de claves. Para ello es fundamental cambiar muy a menudo la clave. A continuación vemos dos ejemplos históricos de sistemas de cifrado, uno de trasposición y el otro de sustitución.
Cifrado rail fence
El sistema de cifrado rail fence cambia la posición de las letras del mensaje siguiendo un criterio definido por una clave numérica. Para ello, si por ejemplo la clave es 5, se etiquetan sucesivamente las letras del mensaje con los números 1, 2, 3, 4, 5, 4, 3, 2, 1, 2, 3, 4, 5, 4, 3, 2, 1 y así sucesivamente. A continuación, se escriben en su orden las letras de etiqueta 1, luego las de 2, las de 3, las de 4 y las de 5. El resultado es el mensaje cifrado. En la tabla 1 mostramos el cifrado del mensaje LA SUERTE ESTÁ ECHADA con clave 5.
Para descifrarlo, se reinvierte la ordenación utilizando la misma clave. Obviamente si la clave fuera por ejemplo, 7 las etiquetas serían 1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1, 2, 3… El sistema rail fence se utilizó durante la guerra de secesión americana (1861-1865). Este cifrado es muy débil.
Cifrado de Vigenère
El sistema de cifrado de Vigenère es un cifrado de sustitución polialfabético, esto es, una letra no siempre se sustituye por la misma. La sustitución se realiza combinando, a través del cuadrado de Vignère, las letras del texto en claro con las letras de la clave. Este cuadrado tiene 27×27 casillas. La primera fila contiene las letras del alfabeto en su orden, comenzando por la A. La segunda las letras del alfabeto empezando por la B, la tercera empezando por la C y así sucesivamente. En cada fila, cuando se llega a la letra Z, se continua con la letra A y siguientes (ver la Tabla 2). Para cifrar un mensaje se elige una palabra clave y se escriben debajo de cada letra del texto en claro, las letras de la palabra de la clave tantas veces como sea necesario. Hecho esto, para cada emparejamiento se busca la letra que en la cuadrícula está en la fila que comienza por la letra del texto en claro y en la columna que comienza con la correspondiente letra de la clave. Esta letra sustituye a la letra del texto en claro. En la tabla 3 se muestra el cifrado de EL TREN LLEGARÁ MAÑANA con la palabra clave TALGO.
El cifrado de Vigenère debe su nombre al diplomático y criptógrafo francés Blaise de Vigenère (1523-1596), quien describió el primer método de cifrado polialfabético Este cifrado tuvo una gran reputación porque se consideraba excepcionalmente robusto. Incluso en 1917, la revista Scientific American afirmó que el cifrado Vigenère era imposible de romper. Esto no era cierto, ya que en el año 1863 Friedrich Kasiski publicó un método basado en el carácter cíclico de la clave y en un análisis de frecuencia de las letras, que rompía el cifrado. Ahora bien, mensajes breves y cambios frecuentes de clave dificultan la ruptura del cifrado.
Terminada la Segunda Guerra Mundial, el surgimiento de los ordenadores e informática, y la globalización de las infraestructuras de comunicaciones, hizo que los bancos, las compañías de seguros, las administraciones y otras instituciones constataran la necesidad de proteger la gran cantidad de datos que manipulaban, salvaguardaban y transferían. Los métodos criptográficos tradicionales se adaptaban bien a los fines para los que fueron diseñados, fundamentalmente diplomáticos y militares. Ahora bien, estaba claro que por sí mismos, no eran los adecuados para intercambios masivos de las claves de cifrado inherentes a la seguridad y fiabilidad de la comunicación electrónica. Se necesitaba crear una nueva criptografía.
Con los ordenadores comienza la era digital. Todo texto, imagen y sonido, se puede convertir en números, que escritos en sistema binario conforman una gran lista de 0 y 1, llamados bits. En un aparato electrónico, el 0 se corresponde con un circuito abierto y el 1 con uno cerrado. Con los números aparecen las matemáticas. Así, la nueva criptografía se sustenta en métodos matemáticos.
WhatsApp cifra los mensajes en los propios teléfonos móviles con el sistema criptográfico simétrico AES-256 (acrónimo de Advanced Encryption Standard), propuesto el año 1998 por los criptólogos belgas Joan Daemen y Vincent Rijmen. WhatsApp ha elegido este sistema por dos motivos: su fortaleza, ya que según los parámetros actuales de potencia informática es prácticamente irrompible por fuerza bruta; y porque la clave de cifrado es relativamente pequeña, 256 bits, lo cual permite operarlo en teléfonos móviles.
El cifrado AES-256
Pasamos a describir de forma esquemática el cifrado AES-256 de WhatsApp, para dar una idea de la complejidad del cifrado.
Consideramos que tanto el texto en claro como la clave están expresados en binario. Así, ambos son una larga lista de ceros y unos, una larga lista de bits. Una secuencia ordenada de ocho bits se denomina byte y denominamos palabra a un conjunto ordenado de cuatro bytes. El cifrado se hace por bloques de 128 bits, por lo que el primer paso es dividir el texto en claro digitalizado en bloques de ese número de bits. Si es necesario se rellena el último bloque hasta completar los 128 bits. Un bloque de 128 bits se puede considerar ya sea como 16 bytes o como cuatro palabras de cuatro bytes.
El cifrado de los bloques es por sustitución, se sustituyen los bits en claro por el resultado de realizar operaciones matemáticas entre bytes y entre palabras de cuatro bytes del texto en claro con los de la clave. Para ello se ha definido una aritmética (suma y multiplicación) para los bytes y otra para las palabras de cuatro bytes.
El cifrado de cada bloque se inicia con la suma byte a byte de los bytes del texto en claro con los primeros 16 bytes de la clave. Sobre el resultado se realizan 14 rondas, consistente cada una de ellas en sumas y multiplicaciones encadenadas entre bytes y entre palabras de cuatro bytes, y en invertir y trasponer bytes. Se termina la ronda sumando byte a byte el resultado de esas operaciones con la subclave de la ronda, que se obtiene por recurrencia a partir de la clave original. Se obtiene así un estado intermedio sobre el que se ejecuta la siguiente ronda. El resultado después de ejecutar las 14 rondas es la cifra del bloque de 128 bits.
Todas las operaciones realizadas entre bytes y entre palabras de cuatro bytes son inversibles. Teniendo la clave, para descifrar un mensaje se recorre el mismo procedimiento, pero de atrás hacia adelante. Esto es posible debido a que a partir de la clave se obtienen las 14 subclaves de las rondas y, con ellas, las rondas son reversibles. La gran fortaleza del sistema de cifrado AES reside en el algoritmo ideado con 14 rondas y la utilización de una subclave diferente en cada ronda.
Recapitulamos. Sabemos que WhatsApp utiliza un sistema de cifrado simétrico, esto es, un sistema en el que el cifrado y descifrado se realiza con la misma clave de 256 bits. La cuestión ahora es que el emisor y el receptor, cada uno por su cuenta, tienen que crear una misma clave intercambiando información a través de canales públicos de comunicación. En definitiva, el objetivo es que de la información pública intercambiada no sea posible obtener la clave común de cifrado.
Un problema matemático difícil de resolver
Los primeros que propusieron una solución fueron Whitfield Diffie y Martin Hellman en el año 1976. Su punto de partida consistía en convertir ese problema en un problema matemático muy difícil de resolver. Para ello se definirían las denominadas funciones de dirección única, que se caracterizan porque dados los valores de partida es “fácil” obtener el resultado, pero que inversamente, del resultado no es posible computacionalmente recuperar los valores de partida. Un símil material es que mezclando el color amarillo con el azul se obtiene el verde, pero el proceso inverso es imposible, del verde no se puede separar el amarillo y el azul.
La función de dirección única que utiliza WhatsApp en la obtención de la clave común indescifrable fue propuesta de forma independiente en el año 1985 por Neal Koblitz y Victor Miller. Consiste en el denominado Problema del logaritmo discreto elíptico. Vemos como se formula.
Consideremos los puntos de una curva elíptica en el plano. Esto es, los puntos (x,y) que verifican la ecuación de la curva. En el caso de WhatsApp la curva elíptica es la Curve25519, de ecuación
y2 = x3 + 486662 x2 + x
Entre los puntos de esta curva se define una suma, de forma que la suma de dos puntos de la curva es otro punto de la misma. Las operaciones numéricas se utilizan en aritmética modular. En el caso de WhatsApp el módulo es el número primo p=2255-19, que tiene 77 cifras decimales, 255 bits.
Elegido un punto P de la curva, es fácil sumar el punto consigo mismo tantas veces como se quiera. La suma d veces P se denota dP. Con un punto P adecuado y en el marco definido, esta suma dP, con d grande, es una función de una sola dirección. Así, si nos dan un punto Q que sabemos que se ha obtenido sumando x veces el punto P, no es posible computacionalmente obtener el número de veces x que se ha sumado P. Este es el Problema del logaritmo discreto elíptico que se ha mencionado antes.
Una vez seleccionada la función de una sola dirección, mostramos la obtención de la clave secreta común con el sistema de intercambio Diffie-Hellman.
Supongamos que dos interlocutores, Ander y Beatriz, quieren construir una clave secreta común para cifrar sus mensajes. En primer lugar acuerdan un número P0 de la curva elíptica. WhatsApp siempre elige el mismo punto P0 , el de coordenada x0=9. Ander elige un número dA que lo guarda bien guardado, que es su clave secreta. Con el número dA y el punto P0 calcula QA=dAP0 (función de una sola dirección) y, sin tomar ninguna precaución, se lo envía a Beatriz. Este número es la clave pública de Ander. Beatriz por su lado hace lo mismo, elige su clave privada dB, calcula su clave pública QB=dBP0 y se la envía a Ander. Este, con su clave privada y la pública de Beatriz calcula dAQB, mientras que Beatriz de igual forma calcula dBQA. Como
dAQB=dAdBP0 =dBdAP0 =dBQA
ambos obtienen por sí mismos y para ellos solos el mismo punto KAB. La clave secreta común es la coordenada xAB de este punto. Al par de claves pública-privada que acabamos de describir le denominamos claves Diffie-Hellman (DH). Resumiendo, la clave común la genera cada uno con la parte privada de su clave DH y la pública de la del otro. Dada la aritmética modular utilizada, las claves tienen 256 bits, que es tamaño de clave que requiere el sistema criptográfico AES-256 de WhatsApp. WhatsApp ha elegido este sistema de cifrado sobre una curva elíptica porque, para claves de 256 bits, es más potente que sus competidores.
Cómo opera WhatsApp
WhatsApp no es un sistema descentralizado, es una empresa con un propietario. Para utilizarlo hay que registrar en un servidor una cuenta con un número de teléfono asociado a un teléfono móvil. Al instalar la aplicación de WhatsApp, se generan y almacenan automáticamente en el teléfono móvil unas claves identificativas del usuario y unos pares de claves DH de un solo uso. Estas se utilizan en la primera vez que se establece una sesión con otro usuario. En el momento del registro, el cliente de WhatsApp transmite al servidor de WhatsApp las claves de identidad y la parte pública de las claves de un solo uso que ha generado. Obviamente WhatsApp no puede obtener las correspondientes claves privadas.
Cuando Ander quiere establecer por primera vez una sesión con Beatriz, el servidor procede a su identificación, les pone a ambos en contacto y le envía a Ander la parte pública de una clave DH de un solo uso de Beatriz. El servidor la borra de su memoria, no se usa nunca más. Aquí termina para siempre la intervención del servidor central. Automáticamente Ander genera un par de claves DH y con su parte privada y la pública que ha recibido de Beatriz genera una clave común que denominamos clave de cadena. A partir de ella, Ander va generando de forma encadenada una clave de mensaje diferente para cifrar cada mensaje que envía a Beatriz, hasta recibir una respuesta de ella. Ander incluye en la cabecera de cada mensaje la parte pública de la clave de cadena. Beatriz, con la parte pública que le ha enviado Ander y con la parte privada de la suya obtiene la clave de cadena, a partir de ella las claves de mensaje y los descifra. Para sus repuestas Beatriz hace lo mismo. Genera un par de claves DH y con su parte privada y con la pública que Ander le ha enviado con sus mensajes, genera una nueva clave de cadena, de ella obtiene las claves de mensaje, los cifra y en la cabecera de cada mensaje incluye la parte pública la clave de cadena que ha generado. Ander descifra los mensajes y para sus respuestas renueva el par DH y repite el proceso.
Un cambio de clave de cifrado para cada mensaje
A modo de resumen, cada vez que recibe una respuesta de su interlocutor, un usuario genera una nueva la clave de cadena y en consecuencia una nueva cadena de mensajes, con las que cifra los mensajes. Este cambio de clave de cifrado para cada mensaje es uno de los pilares de la seguridad del cifrado de WhatsApp.
El cifrado extremo a extremo de WhatsApp es muy fuerte criptográficamente. Otra cuestión es la seguridad a nivel global en el entorno en que se ejecuta la aplicación. Por ejemplo, la vulnerabilidad de los dispositivos del receptor y del emisor puede hacer posible que un atacante acceda a través de un troyano al sistema operativo del dispositivo y de la aplicación, y disponga del contenido de las conversaciones y archivos antes del cifrado.
Para saber más
Mikel Lezaun. Cifrado extremo a extremo de WhatsApp, La Gaceta de la RSME, Vol. 26 (2023), Núm. 2, Págs. 299–315.
Sobre el autor: Mikel Lezaun Iturralde es catedrático jubilado de Matemática Aplicada de la UPV/EHU
Pasko
Es la primera vez que entiendo los algoritmos de cifrado ¿también llamados asimétricos? de una manera clara y sencilla.
Además de los eslabones débiles en los terminales de los usuarios: ¿No debería considerarse también como punto débil el momento de borrado en memoria de los servidores del primer intercambio de claves?
Y otra duda:
¿Tiene sentido comparar la robustez en las comunicaciones de esta app con la de otras como Signal o Telegram, teniendo en cuenta que todos son sistemas centralizados?
Muchas gracias.