MTProto
Что это
MTProto (Mobile Transport Protocol) — основной криптографический протокол мессенджера Telegram. Разработан Николаем Дуровым (математиком, брат Павла Дурова) и командой Telegram. Первая версия — MTProto 1.0 (2013). Текущая — MTProto 2.0 (декабрь 2017). Не путать с MTProto Proxy — это отдельный прокси-протокол на его основе.
Зачем изобрели свой
Когда братья Дуровы делали Telegram (2013), они не взяли готовые протоколы (например, TLS, HTTPS или Signal Protocol от Open Whisper Systems). Причины по их объяснению:
- TLS слишком тяжёлый для мобильных с плохой связью
- Нужна была работа поверх TCP, UDP и даже HTTP long-polling
- Дуров-старший имел кандидатскую по математике и хотел свою
Это «rolled-your-own crypto» — то, за что криптографическое сообщество Telegram сильно ругало.
Как устроен (MTProto 2.0)
Слои
- Auth key — постоянный 2048-битный ключ, установленный при первом подключении через Diffie-Hellman с сервером Telegram. Хранится на устройстве и на сервере
- Server salt — периодически меняющаяся соль от сервера, для защиты от replay
- Session — временная сессия внутри auth key, привязана к устройству
- Message — конкретное сообщение с msg_id (timestamp-based), seq_no, длиной, телом
Шифрование
- Алгоритм — AES-256 в режиме IGE (Infinite Garble Extension) — редкий выбор, критиковали
- Ключ (aes_key) и IV (aes_iv) выводятся из auth_key через SHA-256 функции
- Каждое сообщение имеет msg_key — SHA-256 от части ключа + данных, служит как MAC
- Cхема: MAC-then-Encrypt — тоже нестандарт (обычно Encrypt-then-MAC)
Diffie-Hellman первого подключения
1. Клиент: req_pq_multi (nonce)
2. Сервер: resPQ (server_nonce, pq)
3. Клиент: раскладывает pq на p и q (RSA prime factorization challenge)
4. Клиент: req_DH_params с зашифрованным по RSA server_public_key
5. Сервер: server_DH_params (dh_prime, g_a)
6. Клиент: set_client_DH_params (g_b)
7. Обе стороны вычисляют auth_key = g^(a*b) mod dh_prime
8. auth_key = 256-байт (2048 бит) секрет
Cloud chats vs Secret chats
| Cloud (обычные) | Secret (секретные) | |
|---|---|---|
| End-to-end | нет, только client-server | да, client-client |
| Сохранение на сервере | да (зашифрованно на серверном ключе) | нет, только на устройствах |
| Мультидевайс | да | нет, только одно устройство |
| Perfect Forward Secrecy | ограниченно (server salt) | да (rekey каждые 100 msg или неделю) |
| Skрутки | групповые чаты, каналы | только 1-на-1 |
| По умолчанию | да | нет, надо создать вручную |
Обычные чаты Telegram НЕ end-to-end — серверы Telegram могут прочитать всё. Только Secret Chat даёт E2E-шифрование.
Критика от криптографов
MTProto 1.0 (2013-2017)
- Moxie Marlinspike (Signal): «дилетантский custom crypto», IGE-mode странный выбор
- Adam Langley (Google): «не рекомендую», нестандартные примитивы
- Matthew Green (Johns Hopkins): «rolled their own crypto» — плохой знак
- Атака Jakobsen–Orlandi (2015) — не пробивала шифрование, но показала слабости в схеме
MTProto 2.0 (2017-сейчас)
- Исправили большинство теоретических уязвимостей
- Улучшили MAC (msg_key считается по большему количеству данных)
- ETH Zurich (2021): формальный анализ, «в целом безопасен, но с оговорками»
- Формально верифицирована симвотическая безопасность, но не полностью на всех уровнях
Транспорты MTProto
MTProto — уровнем криптографии выше транспорта. Может работать поверх:
- TCP — Abridged/Intermediate/Full formats — стандарт
- UDP — редко
- HTTP long-polling — для мобильных с плохой связью или где TCP:443 не работает
- WebSocket — для web-версии Telegram
Работа с Telegram-серверами
Клиент подключается напрямую к DC (Data Center) — их 5-6 штук по миру (Amsterdam, Miami, Singapore и др.). MTProto скрывает от провайдера только содержимое, IP-адрес DC виден. Именно поэтому РКН в 2018 году блокировал по IP, а не по DPI-сигнатуре MTProto.
MTProto как прокси
На основе MTProto построен отдельный прокси-протокол — MTProto Proxy (2018). Работает как обёртка: клиент шлёт данные Telegram через прокси-сервер, а тот пересылает на настоящий DC Telegram. См. отдельную страницу.
См. также
- MTProto Proxy — прокси-обёртка на основе MTProto
- Павел Дуров, Telegram
- TLS — альтернатива, которую Telegram отверг