Шифрование MTProto 2.0
MTProto 2.0 — действующая версия протокола Telegram с 2017 года. В ней исправили спорные места первой версии и привели схему к тому, что криптографы называют «стандартной конструкцией».
Три слоя, из которых собран протокол
MTProto делится на высокоуровневый слой (сами запросы API), криптографический слой (как эти запросы шифруются) и транспортный (как байты летят по сети). Шифрование живёт во втором слое и одинаково для мобильного интернета, Wi-Fi и прокси — посредники видят только третий слой.
Ключ авторизации
При первом запуске приложение и сервер вырабатывают auth_key длиной 2048 бит по протоколу Диффи — Хеллмана, защищённому RSA-подписью сервера. Ключ хранится на устройстве и не передаётся по сети никогда. Именно поэтому прокси, перехватив трафик, ничего с ним сделать не может — вывести ключ из перехваченного обмена математически невозможно.
Как шифруется каждое сообщение
- msg_key. От auth_key и открытого текста считается SHA-256, из которого берутся 128 бит. В 1.0 здесь была SHA-1 — одно из главных изменений.
- Ключ и вектор. Из auth_key и msg_key через SHA-256 выводятся AES-ключ и IV для этого конкретного сообщения.
- AES-256-IGE. Сообщение шифруется в режиме IGE (Infinite Garble Extension), где ошибка в одном блоке портит всё дальнейшее — это делает подмену куска сообщения бессмысленной.
- Дополнение. К открытому тексту добавляется 12–1024 случайных байт, чтобы длина не выдавала содержимое.
Что изменилось по сравнению с 1.0
SHA-1 заменили на SHA-256, дополнение стало случайной длины, а msg_key теперь зависит и от ключа, и от текста — так закрыли теоретические атаки на схему «шифруй, потом MAC». Версии подробнее сравниваются на странице «Версии MTProto».
Что шифрование не защищает
Облачные чаты расшифровываются на серверах Telegram — иначе не работала бы синхронизация между устройствами. Сквозное шифрование есть только в секретных чатах и звонках; там ключ известен лишь двум устройствам. Прокси в обоих случаях видит одинаково зашифрованный поток. Разбор — «Безопасность MTProto».