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.
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):

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.
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:

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
Ver 64 comentarios
64 comentarios
oxid
Simplemente excepcional Guillermo, enhorabuena, un artículo de categoría.
Saludos!
rubnagudo21
Gran articulo Guillermo, pero un par de notas que he leido en cryptofails:
- Segun ellos SHA1 esta criptograficamente roto, aunque solo se haya realizado teoricamente y recomiendan SHA512(mas lento) o BLAKE2.
- Deberían usar Encrypt then MAC en vez de lo que hacen actualmente.
y algunas cosillas mas, y por tanto los señores hackers y criptografos concluyen que telegram es igual de inseguro que whatsapp.
Por supuesto a mi me parece una exageracion. Porque algo que yo considero criptograficamente seguro, llevandolo a algo mas mundano, seria un tanque, un bunker. En cambio, telegram seria el tipico renault que pasa con 5 estrellas los test de seguridad. No es infalible, como nada en este mundo en seguridad, pero si que ofrece unos niveles muy razonables de seguridad para una aplicacion de mensajeria.
Saludos!
darkyevon
A mi lo que me sorprende es que whatsapp no haga lo mismo. Que tampoco es nada extraordinario lo que hace telegram, simplemente es lo que debe hacerse para tener cierta seguridad. Con la de millones de clientes que tiene whatsapp y seguimos con una aplicacioń que le añaden una funcionalidad cada 3 años y su seguridad es prácticamente inexistente.
cathangb
Otro Line que acabaremos desinstalando a los dos meses porque nadie lo usa...
mussgo182
Con tanta publicidad que le hacen a esta app en lugar de animarme a usarla me ahuyentan, así como en su día pasó con Line :)
bng
Muy interesante, muchas gracias!
naranj
ya es la app gratis mas descargada en la App Store españa, y subiendo..
thisischuck
Muy interesante, pero no me interesa la seguridad en mis mensajes, nunca envío mis códigos para activación de ojivas nucleares por ese medio. Me quedo con whatsapp.
pikilon
Una de las ventajas de Telegram vs whatsapp es que puedes correrlo en TABLETS (que no tengan SIM).
Whatsapp está dejando la puerta abierta para que la competencia crezca ahí.
En el terreno personal para mi el cliente WEB es imprescindible. Que pueda seguir una conversación en el escritorio.
Hasta el momento tengo Hangouts, pero los de google hacen las cosas a medias, esta está mejor hecha y con menos dinero.
guillermo.pena.carda
Y por que no han simplificado todo un poco y han usado cifrado asimétrico? La clave privada en cada terminal y la publica en el servidor, y cuando añades un usuario nuevo te traes del servidor la clave publica de tu contacto para cifrar los mensajes... mas sencillo y seguro no?
carinox
Yo pensaba que era una tienda de venta de cocaina a domicilio...algo asi como Telepizza. O.o
yastgo
Llevo tiempo buscando una explicación a como cifra. Muchas gracias
ale7andro
Me apuesto el cuello a que Guillermo ha visto algún vídeo de Intypedia, por el ejemplo con Alicia y Bernardo...
(Qué mal rollito me dan los movimientos de Bernardo, por cierto...)
djbg
Que pasa cuando se usa aplicación "Unofficial"?
...por que la promocionan en su pagina.
dany_danay
Buenísima explicacion. Aquí me he descargado Telegram versiones para la web, PC, Android...
telegramweb
Gran articulo de esta buena app que para mi, sera una alternativa seria a whats app, a ver que pasa con el tiempo.
Sin duda, la seguridad sera uno de sus puntos fuertes
ale2390
Alguien sabe donde telegram guarda sus conversaciones? Están encriptadas?
Un saludo
d3i
Ha quedado todo muy bien explicado. Solo falta apoyar a la primera aplicación de mensajería open. A ver si entre todos lo conseguimod porque tiene muy buena pinta y sensaciones. Al fin algo libre y gratis.
jorgejirobis
Gozada de artículo, bien explicado y sin decir burradas. Sólo por ver que se indica "cifrado" que es lo correcto, en lugar de encriptar/encriptado que es una palabra que no existe en español, casi se me caen las lágrimas.
¡Excelente artículo!
fellows.devel
No contacs at all... I will not change my contacts numbers to international format... Sorry... No good
xqs
ya es molesta tanta publicidad de telegram.