logo
Исследование мобильных средств

2.2.4 Telegram

Данное приложение создано Павлом Дуровым, основателем социальной сети "ВКонтакте". С самого создания разработчики говорили о том, что отличительной чертой данного мессенджера является наличие шифрования. Чаты в этой программе делятся на обычные и секретные. Далее я буду рассматривать секретные чаты, так как только они в данной программе поддерживают сквозное шифрование.

Для шифрования данных разработчики используют протокол MTProto. Рассмотрим протокол шифрования данных в секретных чатах, который приведенный в документации [13]:

1) Инициатор запускает метод messages. getDhConfig, чтобы сгенерировать параметры для протокола Диффи-Хеллмана: простое число p и элемент высокого порядка g.

2) Инициатор вычисляет случайное 2048-битное число a, вычисляет g_a: = pow (g, a) mod dh_prime и запускает messages. requestEncryption, чтобы отправить запрос получателю.

3) Получатель принимает запрос, обновляет параметры для протокола Диффи-Хеллмана, вычисляет случайное 2048-битное число b по тем же правилам, что инициатор вычислил a.

4) После принятия запроса получатель вычисляет конечный общий ключ по формуле key = (pow (g_a, b) mod dh_prime), затем вычисляет g_b: = pow (g, b) mod dh_prime и запускает messages. acceptEncryption.

5) После получение g_b инициатор также вычисляет конечный общий ключ по формуле key = (pow (g_b, a) mod dh_prime).

6) Далее с помощью SHA-1 (алгоритм криптографического хеширования) вычисляются ключи шифрования:

a) Вычисляется msg_key путем выбора 128 бит из SHA-1 от текста сообщения;

b) x=0;

c) sha1_a = SHA1 (msg_key + substr (key, x, 32));

d) sha1_b = SHA1 (substr (key, 32+x, 16) + msg_key + substr (key, 48+x, 16));

e) sha1_с = SHA1 (substr (key, 64+x, 32) + msg_key);

f) sha1_d = SHA1 (msg_key + substr (key, 96+x, 32));

g) aes_key = substr (sha1_a, 0,8) + substr (sha1_b, 8,12) + substr (sha1_c, 4,12);

h) aes_iv = substr (sha1_a, 8,12) + substr (sha1_b, 0,8) + substr (sha1_c, 16,4) + substr (sha1_d, 0,8).

Данные шифруются 256-битным ключом aes_key и 256-битным вектором инициализации aes_iv, используя алгоритм шифрования AES-256 в режиме расширения неопределённого искажения (infinite garble extension, IGE).

7) Отпечаток ключа шифрования key_fingerprint и msg_key добавляются в начало массива байтов, после чего запускается messages. sendEncrypted.

8) Для расшифровки алгоритм из пункта 6 воспроизводится в обратном порядке.

Новые ключи в данном протоколе формируются в двух случаях: если старыми были зашифрованы 100 сообщений или если старым ключам больше недели и с помощью них зашифровали хотя бы одно сообщение. Для формирования новых ключей существует отдельный протокол, описанный на сайте разработчиков [14] и мало чем отличающийся от приведённого выше.

Стоит отметить полезную особенность секретных чатов - в их настройках можно указать время автоматического удаления сообщений. Например, поставить таймер на 5 секунд и тогда каждое сообщение будет автоматически удаляться через 5 секунд после доставки.

Исходные тексты клиентской части данного приложения представлены на портале GitHub [15]. Таким образом, клиентскую часть также могут инспектировать независимые эксперты. Исходные коды серверной части остаются закрытыми и публиковаться не собираются.

Из всего вышесказанного можно сделать вывод о том, что секретные чаты в мессенджере Telegram предоставляют возможность организовать действительно защищенный канал связи.