Así funciona la seguridad de Telegram

Así funciona la seguridad de Telegram
65 comentarios Facebook Twitter Flipboard E-mail

A estas alturas todos habéis oído hablar ya de Telegram, la nueva aplicación de mensajería instantánea que pretende reemplazar a Whatsapp (aunque muchos pensamos que eso es imposible). Una de sus mayores ventajas, según sus creadores, es su seguridad.

Telegram implementa un protocolo propio, MTProto, que transmite los mensajes de forma segura entre nuestro móvil y el servidor. Incluso permite crear chats seguros entre dos clientes, de tal forma que ni siquiera los servidores de Telegram pueden ver qué estás enviando. Ahora bien, ¿cómo funciona? En este artículo vamos a explicar en qué consiste la seguridad de Telegram.

Un vistazo a…
DOMINA TELEGRAM 25 TRUCOS para ser todo un EXPERTO

La base: criptografía simétrica

Básicamente y a grandes rasgos, Telegram cifra los mensajes de una forma simple: se cifra con una clave y se descifra en el otro lado con esa misma clave. Al estar los mensajes cifrados, alguien que esté espiando el tráfico de nuestro móvil no sabrá de qué estamos hablando con nuestros amigos.

Esa es la idea principal de Telegram. Fácil, sencillo y para toda la familia. Pero las cosas se empiezan a complicar pronto.

Y el primer problema que nos surge es la clave. Está claro que la clave no puede ser la misma para todos los clientes porque entonces cualquiera podría descifrar los mensajes. Tiene que ser distinta para cada cliente.

Estamos en una posición complicada. Cada vez que un usuario instale la aplicación de Telegram se tiene que crear una clave, y esa clave tiene que enviarse al servidor para que pueda descifrar los mensajes. Obviamente, no podemos transmitir la clave en claro al servidor. Hay que buscar una forma de decirle al servidor cuál es la clave sin decirle cuál es la clave. Esta idea, que parece imposible, es en realidad un algoritmo muy sencillo.

Diffie-Hellman, intercambiando claves de forma segura

La implementación de Diffie-Hellman se basa en matemáticas, más concretamente en grupos de enteros multiplicativos módulo p, con p primo. Sin embargo, lo que nos interesa de esa teoría matemática es una propiedad muy importante: es muy fácil operar un número a con otro b para que salga c, pero a partir de c es muy difícil saber qué números a y b lo han generado.

Pero es más fácil entender Diffie-Hellman con colores que con números. Este es el esquema del intercambio de claves (suponiendo que no sabemos cómo separar dos colores):

Diffie-Hellman

Olvidémonos por un momento de Telegram, y supongamos que tenemos a dos amigos, Alicia y Bernardo, que quieren crear un color secreto que sólo sepan ambos. Lo primero que tienen que hacer es ponerse de acuerdo en un color de partida común, que usarán los dos, en este caso el azul. Además, cada uno elige un color secreto que nunca será compartido ni visto por nadie.

Diffie-Hellman permite que ambas partes lleguen a una clave común secreta, sin tener que transmitirla.

Alicia mezcla su color común con el color secreto, y le pasa el resultado (al que llamamos color intermedio) a Bernardo. Bernardo lo mezcla con su color secreto: lo que quede será la clave secreta, que Alicia obtendrá de forma análoga.

Lo mejor de todo es que aunque alguien intercepte el color común y los dos colores intermedios, no sería capaz de llegar a la clave secreta. Podría mezclar todo lo que quisiese esos colores pero nunca llegaría a la misma combinación que conforma el color final.

Volviendo a Telegram: problemas técnicos adicionales

Ahora que ya sabemos cómo comparte el cliente y el servidor la clave, parece que todo está resuelto. Sin embargo, sigue habiendo problemas que obligan a modificar el protocolo, y para entenderlos tenemos que profundizar un poco en temas técnicos.

Telegram usa el algoritmo de cifrado AES con claves de 256 bits, en modo IGE (Infinite Garble Extension). El modo tiene que ver con la entrada del algoritmo: AES cifra por bloques, cadenas de 128 bits. Dependiendo del modo en el que usemos el algoritmo, cifraremos los bloques provenientes del texto plano o los combinaremos de alguna forma con bloques cifrados anteriores. Si estáis interesados en el tema, este es un buen recurso, pero el modo de AES no nos interesa demasiado para este artículo.

Lo que sí nos importa es que AES-IGE es vulnerable a ciertos ataques de criptoanálisis. Por ejemplo, a CPA (Chosen Plaintext Attack). Este tipo de ataque consiste en cifrar ciertos textos planos que tú conoces y ver cuál es el resultado. A partir de esos textos (que no son elegidos al azar, sino que se forman específicamente para cada situación), se pueden inferir datos sobre la clave, reduciendo las posibilidades y aumentando la probabilidad de adivinarla por completo.

Para contrarrestar este tipo de ataques, Telegram implementa dos características ingeniosas. La primera es que, cuando se cifra un mensaje, no se cifra sólo el mensaje sino que a él se añade un salt, una cadena aleatoria que define el servidor de Telegram, la hora actual y un número de secuencia que indica el orden del mensaje.

De esta forma, un atacante no puede cifrar con AES-IGE el texto que él quiera, ya que la aplicación siempre añade esos tres valores fijos que él no controla.

La segunda característica tiene más implicaciones, y es que antes os he mentido un poco. La clave que comparten servidor y cliente no es la que se usa para cifrar los mensajes. Veamos los detalles en la siguiente sección.

MAC y cifrado de mensajes

Además de cifrar los mensajes, querremos comprobar que no se han modificado por el camino (accidentalmente o por un atacante). Para ello usamos un MAC. Y no me refiero a los Mac de Apple, sino al Message Authentication Code, o código de verificación de mensaje.

Este código se obtiene a partir del mensaje, y es (casi) único. Si el mensaje cambia aunque sólo sea en una tilde, el MAC será distinto. Es parecido a las funciones hash o de huella digital, aunque no exactamente igual.

La clave con la que se cifra el mensaje depende de su contenido.

A la hora de enviar el mensaje, Telegram obtiene su huella digital mediante el algoritmo SHA-1. El resultado es una clave que identifica al mensaje. Pero además ese resultado se combina junto con la clave compartida entre cliente y servidor para obtener una nueva clave con la que cifrar el mensaje.

Es decir, que la clave con la que se cifra cada mensaje depende de su propio contenido. Este hecho da mucha robustez al cifrado de Telegram y además impide varios ataques a los que son vulnerables algunos de sus componentes. El esquema final del cifrado es el que sigue:

MTProto

Tras cifrar el mensaje, se envía un paquete que contiene el mensaje cifrado, la huella digital SHA-1 del texto sin cifrar y un número que identifica la clave compartida que se usa.

Al recibir el mensaje en el otro lado de la conexión, se recrea la clave de cifrado usando la clave compartida y la huella del mensaje, se descifra el texto y se comprueba que la huella digital concuerda. También se comprueba que el salt sea correcto (igual al que el servidor haya definido), que la fecha y hora sea razonable (por ejemplo, no aceptaremos un mensaje con fecha dos años en el futuro) y que el número de secuencia sea el apropiado.

Así, con esa comprobación múltiple, Telegram se asegura que nadie más puede leer el mensaje y que además ha llegado sin ningún tipo de modificación.

Otros detalles: chats seguros y firma digital

Nos hemos dejado dos temas en el tintero en la explicación. El primero es rápido: ¿cómo se aseguran las conexiones que se realizan antes de generar la clave compartida? Ya hemos visto que no pasa nada porque alguien vea el intercambio Diffie-Hellman, pero, ¿cómo sabemos que realmente estamos hablando con el servidor oficial de Telegram y no con un impostor?

La solución es sencilla: usando certificados digitales. Cuando el servidor envíe mensajes al cliente, adjuntará la firma digital que se puede verificar con la clave pública que almacenan las aplicaciones. En Genbeta ya explicamos a fondo en qué consiste la firma digital con clave pública/privada, por si tenéis interés en ello.

Por otra parte, Telegram también ofrece chats seguros en los que ni siquiera su servidor puede leer lo que envías. El esquema es exactamente el mismo que en las comunicaciones cliente-servidor, sólo que esta vez la clave se la intercambian los dos clientes que hagan el chat seguro. El servidor de Telegram sólo se encarga de poner en contacto inicialmente a ambos clientes.

En general, el protocolo de Telegram está bastante bien pensado y aunque no es será infalible (nada es 100% seguro) sí que ofrece muchísima más seguridad que las otras alternativas que hay en el mercado, además de la ventaja de ser un protocolo abierto para que todos lo puedan estudiar.

Más información | Telegram Advanced FAQ

Comentarios cerrados
Inicio