Разбор расшифрованных encrypted_data в Telegram

Я пытаюсь реализовать прием / отправку сообщений через секретный чат в Telegram (что-то вроде собственного клиента), но столкнулся с некоторыми проблемами при интерпретации расшифрованных данных. Я прочитал схему, но не могу сопоставить ее с моими данными.

Чтобы быть более конкретным: я получил сообщение (отправленное от официального клиента) со словом "Test12", декодированный результат (в шестнадцатеричном формате) был:

3C0000008917E31B0FF1C770B657C36AF705BDACA4BE2C0B2E0000000100000062000000DE91B0360000000038507C7CD5FA6F7C00 00000006 546573743132 00

Здесь мы можем найти все сообщение, начиная с 57 байт (жирный шрифт) и (если я не ошибаюсь) длины (курсив). Но как я могу сопоставить другие байты? В схеме сказано, что сообщение должно начинаться с 8 (соль) + 8 (идентификатор_ сеанса) + 8 (идентификатор_ообщения) + 4 (seq_no) + 4 (длина_данных_ообщения) = 32 байта, а не с 57 байтов.

Более того, когда я пытаюсь отправить более длинное сообщение (более ~256 байт), "текст сообщения" начинается с 60 байт, а длина также кодируется немного странно: FE000400 для 1024-байтового сообщения и FE000200 для 512 байт (что значит ИП?).

Итак, кто-нибудь может дать мне схему или понять, что я делаю не так?

1 ответ

Решение

Хорошо, похоже, мне удалось расшифровать большую часть сообщения. Может быть, это будет полезно для кого-то:

3C000000 Количество "ценных" байтов (не включая заполнение случайными байтами в конце, если они необходимы)

8917E31B (== 467867529), код decryptedMessageLayer (уровень 17)

0FF1C770B657C36AF705BDACA4BE2C0B массив сериализованных случайных байтов (должен состоять минимум из 15 байтов), OF = 15 - текущее количество

2E000000 кажется номером минимального слоя

01000000 in_seq_no, (1 - 1) / 2 = 0 полученных сообщений, см. Порядковые номера

62000000 out_seq_no, 62 / 2 = 49 отправленных сообщений, см. Порядковые номера (отправитель сообщения не запустил этот чат)

DE91B036 код расшифрованного сообщения# 36b091de

00000000 не знаю

38507C7CD5FA6F7C, по-видимому, является randomId (может быть таким же, как и сообщение, переданное с?)

00000000 не знаю, может быть, это ттл

0654657374313200 сериализованная строка: первые два байта (06) средней длины. Если их больше 254, вместо них помещается DE(=254), и длина может быть найдена из следующих 3 байтов (начиная с позиции 60 в моем "упомянутом" случае). Строковые байты следуют за (значит Test12) и дополняются 0-3 нулевыми байтами (00).

После этого результат дополняется случайными байтами (0-15) для создания полного 16-байтового блока.

Другие вопросы по тегам