Начнём с простого. Telegram-клиенты общаются с Telegram-серверами по собственному протоколу MTProto поверх TCP. Для соединения используются несколько адресов, которые не изменялись годами и продолжают являться основными точками подключения. Возьмём для примера один из адресов европейского региона: 149.154.167.40.
Обычно используется порт 443, но никакого отношения к SSL/TLS это не имеет.
На приведённой схеме видно, из чего состоит каждый пакет. Открытые пакеты используются только при первых коммуникациях с целью обменяться ключами, дальше вся связь зашифрована.
Обратите внимание, что даже в зашифрованных пакетах есть постоянные заголовки: первые 8 байт будут одинаковыми в пределах сессии, так как представляют из себя отпечаток авторизационного ключа. К этому моменту мы скоро вернёмся.
Роскомнадзор, мать его
И тут в игру вступает злое государство и его орган, регулирующий интернет, который начинает блокировку Telegram! В нашем случае это Роскомнадзор, который добавляет в выгрузку для провайдеров все подсети Telegram, в том числе ту, в которой находится наш 149.154.167.40. Провайдеры получают выгрузку и закрывают доступ пользователям к указанным адресам.
Экстренное шифрование файлов на Python гибридным протоколом в комплекте с телеграм ботом
Команда Telegram, конечно, не оставила нас в беде. Ребята запустили множество серверов у разных хостинг-провайдеров, которые стали принимать пакеты и переадресовывать их на основные Telegram-сервера, попавшие под блокировку.
Откуда же приложение на вашем телефоне/компьютере узнает адреса этих новых серверов? Используются два метода.
Как доставить новые адреса серверов клиентам?
DC_UPDATE
Это первый способ, которым адреса новых серверов доставляются на устройства пользователей. Подходит он только для мобильных клиентов на iOS и Android, потому что использует Apple Push Notification Service и Google Cloud Messaging соответственно. Команда Telegram отправляет вам на устройства push-уведомления, внутри которых содержится список новых адресов. Приложение Telegram считывает их и начинает использовать эти адреса для связи.
- Помешать затее можно только заблокировав APNS и GCM полностью, что лишит вас всех уведомлений от всех приложений, даже если вы никогда не пользовались Telegram. На это власти не пойдут (?).
- В теории этот способ позволяет отправлять разным группам пользователей разные адреса, что может отсрочить блокировку новых серверов и помочь команде Telegram вычислить шпионов. На практике эта хитрость, насколько я знаю, не используется.
- Подходит только для мобильных устройств, так как на десктопных операционных системах нет единого механизма доставки уведомлений.
- Может работать нестабильно. Если уведомление по каким-то причинам до вас не дошло, приложение Telegram не узнает о новых адресах. Особенно актуально для iOS, где приложения сильно ограничены в фоновой обработке уведомлений. Именно поэтому на iOS такие push видны пользователю и требуют нажатия для активации.
Роскомнадзор выслеживает новые адреса, приходящие в DC_UPDATE и блокирует их.
Как получить доступ к GPT4 в Telegram? GPT4 и GPT3 проходят ТЕСТ курса по Телеграм ботам!
Domain fronting
Этот способ доставки адресов не так широко известен, а многие вовсе не понимают, как он работает.
Для начала рекомендую прочитать общее описание. Telegram же просто помещает зашифрованный список в TXT-записи своих сервисных доменов и на платформе Azure. Затем клиенты запрашивают эти данные с адресов dns.google.com и tcdnb.azureedge.net/prodv2/config.txt. Техника domain fronting позволяет сделать так, что провайдерские системы фильтрации и блокировок видят это как запросы к google.com и software-download.microsoft.com.
Плюсы domain fronting:
- Для блокировки этого способа придётся заблокировать весь google.com и сервис доставки обновлений Windows. Роскомнадзор на такое пойти не может. Однажды они блокировали google.com, но дали заднюю.
- Может работать и работает на любых платформах, включая десктопные.
obfuscated2: Защита от более продвинутого DPI
Что, если регулирующий интернет орган вроде Роскомнадзора станет чуть умнее? Если ещё не забыли, в начале статьи я упомянула, что даже в зашифрованных пакетах Telegram всегда есть постоянные заголовки. При желании провайдер может отслеживать эти заголовки и блокировать соединения на основании содержимого пакета, а не адресов серверов. Тогда все вышеописанные техники защиты станут бесполезными, подумаете вы, и окажетесь правы. Почти правы.
Telegram ещё как минимум в начале 2017 года реализовал защиту от подобных «лишних глаз», заглядывающих в пакеты.
Несмотря на то, что протокол MTProto открыт и описан на официальном сайте Telegram, официальные же клиенты используют дополнительный слой обфускации, нигде не документированный. Товарищ Tomas Susanka уже максимально подробно описал используемый метод обфускации пакетов, поэтому расписывать всё не буду.
Обфуска́ция или запутывание кода — приведение исходного текста или исполняемого кода программы к виду, сохраняющему её функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции.
Клиент придумывает случайный 32-байтовый ключ и случайный 16-байтовый Initialization Vector, которыми шифрует каждый пакет с помощью AES CTR, а чтобы сервер узнал, как это расшифровать… ключ и IV добавляются в начало пакета перед зашифрованным содержимым.
Вы назовёте это глупостью, ведь какой смысл отправлять зашифрованные пакеты и сразу прикладывать к ним ключ для расшифровки? Конечно, это абсолютно бесполезная защита в логическом смысле, но она имеет большой смысл на практике.
После обфускации все пакеты выглядят как случайный мусор, поэтому для определения, Telegram-трафик это или нет, провайдеру придётся расшифровывать каждый непонятный пакет по методике obfuscated2, прежде чем проводить дальнейшие проверки. Такие действия требуют неоправданное количество вычислительных мощностей, которых у провайдеров попросту нет.
Подключение к Telegram через прокси
Как уже было сказано выше, команда Telegram прикладывает много усилий, чтобы обойти государственные блокировки, но это не всегда работает. Временные сервера быстро блокируются Роскомнадзором и мы снова теряем доступ к мессенджеру.
Дальнейшая борьба с блокировками отдаётся на откуп пользователям. Telegram предоставляет целых два способа подключения через прокси в своих приложениях. Оба способа не предполагают раскрытия ваших переписок и прочих данных держателям прокси-серверов, так как трафик Telegram изначально зашифрован и передаётся через промежуточные звенья в нечитаемом виде.
SOCKS5-прокси
Очень банальный, но действенный способ. Если сможете осилить технический английский, почитайте вот этот RFC-документ.
Клиент Telegram подключается к заданному вами SOCKS5-серверу и уже через него устанавливает соединение с Telegram-серверами. Так как SOCKS5-сервер находится вне страны, которая ввела блокировки, соединения между ним и Telegram устанавливаются успешно.
Простая лазейка будет работать до тех пор, пока сам прокси-сервер не будет отслежен и заблокирован.
- Очень быстро и очень просто.
- Всем известный протокол, серверные реализации которого существуют под все платформы и ОС.
- Протокол очень легко детектируется с помощью DPI, государство может легко в принципе запретить использование SOCKS5 и заблокировать его.
- Логин и пароль для авторизации передаются в открытом виде.
- Если ваше Telegram-приложение получало с помощью ранее описанных методов IP-адреса временных серверов, то при включении SOCKS5-прокси, приложение будет пытаться подключаться именно туда. Так как владельцы прокси, специализирующихся на Telegram, обычно блокируют соединения со всеми адресами, кроме основных подсетей Telegram, у пользователя могут иногда возникнуть проблемы с подключением.
MTPROTO-прокси
Наконец-то мы подошли к тому, чего вы так долго ждали.
Начнём с того, что любой MTPROTO-прокси — самый что ни на есть реверс-прокси. Это значит, что в отличие от SOCKS5, клиент не просит прокси достучаться до какого-то Telegram-сервера. Клиент общается с MTPROTO-прокси так, будто это уже Telegram-сервер.
Официальной документации по MTPROTO-прокси нет до сих пор, хотя в клиентах функциональность реализована давно. Некоторые умельцы написали свои реализации серверов, изучив исходный код клиентов.
MTPROTO-прокси-сервер просто принимает пакеты от клиента и отправляет Telegram-серверу. Обманула, не так просто. Давайте разберёмся.
Во-первых, клиент общается с MTPROTO-прокси только с обфускацией obfuscated2.
Во-вторых, obfuscated2 здесь используется чуть модифицированный. Перед зашифрованной частью всё так же открыто передаются ключ и IV, только вот шифруется сам пакет не этим ключом, а sha256(key+secret). Secret — это тот самый 16-байтовый параметр, который вы заполняете при подключении к MTPROTO-прокси.
Secret нигде не передаётся в процессе связи. Его использует клиент для шифрования пакета и MTPROTO-прокси-сервер для расшифрования.
MTPROTO-прокси-сервер получает от вас пакет, деобфусцирует его ключом sha256(key+secret), затем снова обфусцирует, но уже используя обычный obfuscated2 без дополнительных параметров.
Таким образом получается, что сторонний человек никак не может деобфусцировать и классифицировать трафик между клиентом и MTPROTO-прокси-сервером.
- Трафик между клиентом и промежуточным звеном выглядит как случайный мусор, который при всём желании и наличии вычислительных мощностей не может быть деобфусцирован провайдерами.
- Это реверс-прокси, поэтому клиентам не нужно реализовывать никаких новых протоколов. Только obfuscated2 и поле для ввода secret. Клиент присоединяется к MTPROTO-прокси как к обычному Telegram-серверу.
- Позволяет совершать аудио/видео звонки, если они не работали с SOCKS5-прокси.
- Каждый пакет должен быть дешифрован и зашифрован снова на стороне прокси-сервера. Ещё не проводила оценку, но уверена, что в самой идеальной реализации MTPROTO-прокси-сервера результаты количества одновременных онлайн соединений будут в разы хуже. Этот минус убивает очень многое. Не ждите такого большого количества стабильных публичных прокси-серверов, как в случае с SOCKS5.
- От команды Telegram до сих пор нет никакой официальной документации, примеров реализации и прочих объяснений происходящему. Возможно, ещё не пришло время. Ждём.
Источник: пресс-секретарь VeeSecurity Анна и Хабрахабр
Источник: medium.com
Какой алгоритм шифрования использует телеграмм
Telegram является одним из самых популярных мессенджеров в мире благодаря своим функциям, безопасности и оперативности работы. Один из главных факторов, обеспечивающих безопасность переписки пользователей, это криптографический протокол MTProto.
Что такое MTProto
MTProto — это криптографический протокол, который был разработан Николаем Дуровым и другими программистами Telegram для шифрования и защиты переписки пользователей. Многие эксперты считают, что MTProto — это наиболее безопасный протокол в мире мессенджеров.
Особенности MTProto
Основными особенностями MTProto являются:
- Протокол обеспечивает быструю передачу данных без потерь в качестве;
- Каждый раз при передаче информации формируется новый ключ шифрования;
- Схема аутентификации использует двухфакторную систему, при которой передаваемые сообщения шифруются с помощью одноразовых ключей;
- Протокол защищает от атак типа man-in-the-middle (MITM).
Хранение сообщений и база данных
Telegram использует базу данных SQLite для хранения сообщений, которая не шифруется, но защищена сложным паролем. Согласно эксперту по безопасности Натаниэлю Сачи, базу данных нельзя просто так прочитать, но шифрования в целом нет.
Взаимодействие с спецслужбами
Telegram не обеспечивает полную конфиденциальность, как и любая другая система. Спецслужбы могут получить данные, связанные с моментом взаимодействия пользователей, если на это есть судебный приказ.
Обход блокировки
Telegram может активно обходить блокировку на территории государств, где мессенджер запрещен. Одним из способов является получение клиентами нового списка IP-адресов через push-сообщения от серверов Google, Apple и Microsoft, что невозможно заблокировать без отключения всего механизма оповещений Android, iOS и Windows Phone.
Доступ к QR-коду
QR-код на свой Telegram-аккаунт делать специально не нужно, поскольку он уже есть в мессенджере на смартфоне. На Android QR-код можно открыть, перейдя в боковое меню приложения, нажав на фото профиля и кликнув на QR-значок в правом верхнем углу. На iOS значок QR-кода находится сразу в меню настроек слева от вашей фотографии.
Выводы и советы
Telegram использует передовые криптографические технологии для обеспечения безопасности пользователей, но это не означает, что система является абсолютно защищенной. Пользователям следует придерживаться некоторых правил, чтобы повысить свою защиту:
- Выбирайте сложные пароли и меняйте их регулярно;
- Активируйте двухфакторную аутентификацию;
- Не отправляйте критические данные через мессенджеры;
- Не публикуйте в сети свою переписку, чтобы не дать возможность хакерам получить доступ к вашим личным данным.
Telegram по-прежнему является одной из самых безопасных и удобных систем обмена сообщениями, но у пользователей есть своя ответственность в сохранении конфиденциальности своих данных.
Как Телеграм шифрует данные
Телеграм — это мессенджер, который использует шифрование на транспортном уровне. Это означает, что данные передаются в зашифрованном виде только на этапе пересылки между устройствами пользователей и серверами Telegram. Такой вид шифрования не позволяет создателям Telegram прочитывать сообщения пользователей.
Однако стоит отметить, что Telegram не использует сквозное шифрование. Это значит, что сервера Telegram могут видеть все сообщения, хранить их на своих серверах и даже передавать правительствам. Эта особенность также означает, что данные могут быть подвергнуты хакерским атакам, если сервера Telegram взломают.
Тем не менее, Telegram по-прежнему считается одним из самых безопасных мессенджеров благодаря прочному шифрованию на транспортном уровне и добавлению возможности удаления сообщений через определенное время.
Как фсб читает Телеграм
Можно ли вычислить по телеграмму
Telegram предоставляет своим пользователям сервис «Люди рядом», который позволяет вычислить точные координаты других пользователей приложения. Данный алгоритм обнаружения прост в использовании и легко понятен даже тем, кто не обладает навыками хакинга. С помощью данного сервиса можно легко отслеживать нужного человека и узнавать его местоположение в реальном времени. Таким образом, причины для использования данного сервиса могут быть самыми разными, от поиска потерянных друзей до контроля действий своих близких. Но не стоит забывать о том, что мониторинг чьих-либо действий без их согласия является нарушением их прав на приватность и может привести к неприятным последствиям.
Какая защита у Телеграм
Telegram — мессенджер, который безопасно шифрует ваши сообщения. Но необходимо понимать, что даже социальные сети и мессенджеры могут быть взломаны. Для защиты профиля Телеграм от угона мошенниками рекомендуется использовать пароль. Он должен состоять как минимум из шести знаков, включая заглавные и строчные буквы. Чтобы авторизоваться в аккаунте, пароль обязателен.
Кроме того, Telegram предлагает двухфакторную аутентификацию, которая позволяет дополнительно защитить профиль. Для подключения этой функции вам необходимо перейти в раздел «Настройки», затем выбрать «Конфиденциальность и безопасность» и активировать двухфакторную аутентификацию. Нужно помнить, что безопасность вашей учетной записи зависит от сильного пароля и осторожности в обращении со своими данными.
MTProto — это криптографический протокол, который используется в мессенджере Telegram для защиты переписки пользователей. Разработали его Николай Дуров и другие специалисты этого мессенджера. Этот протокол используется для создания зашифрованных каналов связи между клиентскими приложениями Telegram и их серверами.
MTProto шифрует данные, передаваемые между собеседниками, и защищает их от прослушивания третьими лицами. В данном протоколе используются современные методы шифрования, такие как AES, RSA, DH, SHA и прочие. Протокол также обладает функцией обеспечения анонимности и блокировки внутреннего контента, что позволяет пользователям Telegram общаться более безопасно и эффективно, не опасаясь защиты своих сообщений. Благодаря использованию MTProto, Telegram стал одним из лучших мессенджеров в мире с максимальным уровнем безопасности.
Источник: svyazin.ru
Создание API на основе протокола MTProto
В уже далеком 2019 Telegram объявил конкурс на создание веб-версии своего мессенджера, в котором мне удалось поучаствовать. По итогу у меня осталась библиотека, которая может работать с API Telegram по протоколу MTProto. Полученный опыт вдохновил меня реализовать протокол MTProto для бэкенда. Разработку вел на python, так как я этот язык хорошо знаю и был уверен, что смогу на нем реализовать свою идею. Для удобства использовал библиотеку aiohttp для соединения по web-socket’у, а для описания структур использовал typings и dataclass.
Структура протокола MTProto:
Протокол MTProto можно поделить на три независимые части:
- Верхнеуровневая часть (API и запросы к нему) — описывает, как вызовы и ответы API могут быть переведены в двоичный код.
- Криптографическая (Авторизационная) часть — описывает, как сообщения будут зашифрованы/расшифрованы.
- Транспортная часть — описывает, как зашифрованное сообщение будет передано по одному из протоколов: (HTTP, HTTPS, WS, WSS, TCP, UDP)
Верхнеуровневая часть API — Схема(schema)
Схема телеграма описывает какие есть доступные типы и функции для API. Благодаря схеме клиент знает как сериализовать/десериализовать входящие и исходящие сообщения. Схема описывается на языке TL или с помощью JSON.
Базовые типы:
При описании конструкторов, типов, и функций доступных в схеме используются базовые типы int, long, doubles, bytes, string. Для них описано как они будут сериализованы и десериализованы:
- int — 32 битное знаковое целое, для дампа которого используется little-endian порядок байтов
- long — 64 битное знаковое целое, для дампа которого используется little-endian порядок байтов
- double — 64 битное число с плавающей запятой
- bytes — последовательность байтов определенной длины:
- Если длина последовательности меньше либо равна 253, то в первый байт мы записываем длину последовательности, а в конце добавляем нулевые байты так, что общая длина последовательности делилась на 4.
- Если длина последовательности больше 253, то в первый байт мы записываем число 254, дальше идут 3 байта в порядке little-endian, описывающие длину последовательности, сама последовательность, ну и в конце добавляем нулевые байты, чтобы общая длина делилась на 4.
- string — строка состоящая из UTF-8 символов, для сериализации используется тот же алгоритм, что и для bytes.
Также в MTProto поддерживаются типы int128/int256, но они используются только для шифрования.
Конструкторы и типы данных:
С помощью базовых типов можно описать комплексные структуры. Самая простая комплексная структура — конструктор. Атрибутами конструктора могут быть базовые или пользовательские типы данных.
Для описания конструктора на языке python мы воспользуемся модулем dataclass . Объявим класс, в котором будут описаны все атрибуты конструктора(их может и не быть вовсе). Также объявим класс Meta ,у которого есть два свойства name и order . В свойстве name храним название конструктора, а в order — порядок сериализации/десериализации атрибутов конструктора.
У конструктора могут быть опциональные поля, описанные с помощью типа Optional и функции dataclasses.field , определяющую метаданные для этого поля. Параметр flag определяет какой бит атрибута flag будет индикатором того, определён или нет описанный атрибут.
Атрибутом структуры может быть список. Для определения списка используется тип typing.List с указанием базового или пользовательского типа для элементов списка
Пользовательский тип данных может быть представлен в виде объединения нескольких конструкторов. Для этого используется типы языка Union и Annotated :
Для сериализации/десериализации пользовательских типов данных нужно знать какой конструктор был закодирован.Для этого мы будем использовать 32-битное знаковое число, вычисленное из строки описания конструктора алгоритмом crc32.
Описание конструктора — строка вида:
constructor_name attr_1:AttrType attr_2:AttrType2 … attr_name_n=AttrTypeN = ResType
Зная конструктор или число конструктора, можно сериализовать/десериализовать его содержимое в нужном порядке.
К примеру для конструктора RegisteredUser , который относится к типу User , будет сформирована строка:
registered_user id:int nickname:string = User
А число будет -366049798
Функции
Все функции для протокола будут асинхронными. Первым аргументом является request — объект типа aiohttp.web.Request , который мы используем для доступа к общим ресурсам.
Следующими аргументами могут быть либо базовые, либо пользовательские типы. Все аргументы функции являются обязательными.Результат функции должен иметь пользовательский тип.
from aiohttp.web import Request from mtpylon.crypto import AuthKey from mtpylon.exceptions import RpcCallError from mtpylon.contextvars import auth_key_var from users.utils import login_user, remember_user from ..constructors import User, RegisteredUser async def login(request: Request, nickname: str, password: str) -> User: try: user = await login_user(nickname, password) except ValueError as e: raise RpcCallError(error_code=401, error_message=str(e)) auth_key: AuthKey = auth_key_var.get() await remember_user(user, auth_key) return RegisteredUser(id=user.id, nickname=nickname)
Для идентификации функции используется номер, который считается по алгоритму crc32 из строки вида:
function_name arg_1:ArgType arg_2:ArgType2 … arg_name_n=ArgTypeN = ResType
Контекстные переменные
Для каждого WebSocket соединения определены несколько контекстных переменных:
Схема
Создав типы данных и функции для бэкенда, можем объединить их в схему, которую будет использовать клиент. Для создания схемы используется класс mtpylon.Schema
from mtpylon import Schema from .constructors import ( Bool, User, TodoList, TodoListsResult, Task, TaskList ) from .functions import ( register, login, get_me, create_todo_list, get_todo_lists, get_single_todo_list, remove_todo_list, create_task, get_task_list, edit_task_title, set_as_completed, set_as_uncompleted, remove_task, ) mtpylon_schema = Schema( constructors=[ Bool, User, TodoList, TodoListsResult, Task, TaskList ], functions=[ register, login, get_me, create_todo_list, get_todo_lists, get_single_todo_list, remove_todo_list, create_task, get_task_list, edit_task_title, set_as_completed, set_as_uncompleted, remove_task, ]
Создав схему, мы можем ее сериализовать либо в TL-программу, либо в JSON, используя для этого сериализации mtpylon.serializers.to_tl_program() или mtpylon.serializers.to_json() . Зная как сериализовать и десериализовать сообщения, мы можем начать общение между клиентом и сервером.
Криптографическая(Авторизационная) часть.
Данная часть хорошо описана в официальной документации телеграмма. Есть два варианта сообщений: незашифрованные и зашифрованные сообщения. Незашифрованные используются для создания ключа с использованием алгоритма Деффи-Хельмана. Подробное описание для клиента можно почитать здесь Структура незашифрованного сообщения: Со стороны сервера нам необходимо:
- Cгенерировать и хранить публичный/приватный RSA-ключ.
- Хранить авторизационный ключ(2048 bit). У авторизационного ключа имеется 64х битный идентификатор( auth_id ), поэтому достаточно просто организовать key-value хранилище.
В своей реализации я храню их в памяти, используя класс mtproto.crypto.auth_key_manager.AuthKeyManager , но реализуя протокол mtproto.crypto.auth_key_manager.AuthKeyManagerProtocol ,можно работать с любой бд. К примеру, я использовал postgresql, где хранил id как BigInteger, а сам ключ как BLOB.
Получив ключ авторизации, клиент может посылать сервисные и пользовательские сообщения в зашифрованном виде.
Структура зашифрованного сообщения:
Схема шифрования данных:
Исходя из структуры и схемы, нам надо хранить идентификатор сессии клиента и соль.
Идентификатор сессии session_id
Идентификатор сессии создается пользователем, поэтому пара auth_key_id и session_id будет уникальна, тогда как session_id у разных пользователей может повторяться.
session_id — 64 битное значение, поэтому его легко хранить. mtproto.sessions.sessions_storage_protocol.SessionSсtorageProtocol должен быть реализован для хранения в различных бд, или можно использовать mtproto.sessions.in_memory_session_storage.InMemorySessionStorage для хранения информации о сессии в памяти. Для информирования о создании или удалении сессий используется паттерн observer.
Соль(salt).
Соль — 64 битное случайное число, меняющееся в определенный период времени. Используется для предотвращения атак повторного воспроизведения. Сервер должен генерировать числа на текущее время и на некоторое будущее. Сгенерированная соль и авторизационный ключ создают уникальную пару. Для генерации и работы с солью был создан mtpylon.salts.server_salt_manager.ServerSaltManager , который хранит все данные в памяти. Для реализации кастомного протокола нужно реализовать mtpylon.salts.server_satl_manager_protocol.ServerSaltManagerProtocol .
Подтверждения (acknowledgements)
Каждое сообщение имеет свой id. И пара Авторизационный ключ + id сообщения будет уникальна. Сервер хранит сообщение и пересылает пользователю до тех пор, пока не придет подтверждение, что оно было обработано или сессия пользователя не была уничтожена. Для хранения сообщений в оперативной памяти реализован класс mtpylon.acknowledgment_store.inmemory_acknowledgment_store.InmemoryAcknowledgmentStore .
Транспортная часть.
Зашифрованное сообщение передается по протоколу websocket. Согласно протоколу MTProto, каждое передаваемое сообщение должно быть обфусцировано. Каждое сообщение перед отправкой “оборачивается” в intermediate блок и проходит обязательную обфускацию
Библиотека mtpylon и пример использования.
Реализовав все части протокола MTProto, получилось создать библиотеку mtpylon, с помощью которой можем создать собственное API.
Пример приложения:
1. создадим функцию, генерирующую rsa-ключи:
from typing import List import rsa # type: ignore from mtpylon.crypto import KeyPair # type: ignore def get_rsa_keys(count: int = 2) -> List[KeyPair]: rsa_list = [ rsa.newkeys(nbits=2048) for _ in range(count) ] return [ KeyPair( public=public, private=private ) for (public, private) in rsa_list ]
2. Определим возвращаемый тип, функцию и саму схему:
3. Настроим aiohttp для работы с протоколом:
import sys import logging from aiohttp import web import aiohttp_cors from mtpylon.configuration import configure_app from schema import schema as app_schema from rsa_keys import get_rsa_keys if __name__ == ‘__main__’: app = web.Application() configure_app( app, app_schema, < ‘rsa_manager’: < ‘params’: < ‘rsa_keys’: get_rsa_keys() # вернем сгенерированные ключи >>, ‘pub_keys_path’: ‘/pub-keys’, # url по которому доступны публичные части rsa-ключей ‘schema_path’: ‘/schema’, # url по которому доступна схема в json формате > ) cors = aiohttp_cors.setup( app, defaults= < ‘*’: aiohttp_cors.ResourceOptions( allow_credentials=True, expose_headers=»*», allow_headers=»*», ) >) for route in list(app.router.routes()): cors.add(route) web.run_app(app, port=8081)
4. Запустим приложение:
python ./web.py
5. Со стороны клиента используем библиотеку zagram
const < MTProto, methodFromSchema >= zagram; const WS_URL = ‘ws://localhost:8081/ws’; const PUB_KEYS_URL = ‘http://localhost:8081/pub-keys’; const SCHEMA_URL = ‘http://localhost:8081/schema’; function initConnection(schema, pems) < return new Promise((resolve, reject) => < const connection = new MTProto(WS_URL, schema, pems); connection.addEventListener(‘statusChanged’, (e) => < if (e.status === ‘AUTH_KEY_CREATED’) < resolve([connection, schema]); >else < reject(e.status); >>); connection.init(); >); > Promise .all([ fetch(SCHEMA_URL).then(r => r.json()), fetch(PUB_KEYS_URL).then(r => r.json()), ]) .then(([schema, pems]) => initConnection(schema, pems)) .then(([connection, schema]) => < const rpc = methodFromSchema(schema, ‘echo’, ); return connection.request(rpc); >) .then(console.log);
Итог:
Спасибо Telegram, что разнообразили мои будни, заставили меня поглубже разобраться в криптографии и решать нетривиальные задачи. Буду рад, если кому-нибудь эти библиотеки будут полезны или вдохновят на собственную реализацию протокола MTProto.
исходный код: https://github.com/Zapix/mtpylon
исходный код: https://github.com/Zapix/zagram
- echo-server https://github.com/Zapix/echo-server
- ToDo-list: https://github.com/Zapix/mtpylon-todo-list
Источник: temofeev.ru