End-to-End шифрование в месседжере WhatsApp

Здравствуйте, друзья! После предыдущего поста на меня подписалось аж 55 человек, за что Вам большое спасибо! Также хочу выразить благодарность людям, которые указывали на недочеты — это помогает делать материал лучше.


Некоторые читатели предыдущего поста задавали вопросы про End-to-End шифрование (оно же сквозное) и просили рассказать о нем подробнее. Чтобы не было разночтений, буду писать на примере сквозного шифрования в месседжере WhatsApp.


Описание системы шифрования есть в оригинальной статье на английском (ссылка в конце статьи). Повествование хочется сделать доступным для большинства людей, поэтому математические преобразования не привожу. Они есть в оригинале, если Вам это интересно.


Для начала немножко теории. Почти все современные средства шифрования используют криптографию с открытым ключом (асимметричная криптография). Ключ представляет из себя пару чисел, которые называют открытым и закрытым ключами. Между этими ключами есть зависимость: один ключ шифрует — другой дешифрует. Существуют различные варианты использования этих ключей в зависимости от алгоритма.


Современная асимметричная криптография использует эллиптические кривые ввиду того, что при меньшей длине ключа она гарантирует большую стойкость взломам. А некоторые реализации “эллиптических” алгоритмов работают намного быстрее “классических”. Одним из таких алгоритмов является Curve25519, который используется в криптографическом протоколе Signal, используемом в WhatsApp.

End-to-End шифрование в месседжере WhatsApp Шифрование, Мессенджер, WhatsApp, Длиннопост

В приложении используются три основных типа ключей:

1. Ключ идентификации (Identity key pair) — генерируется при установке приложения. Как правило, меняется только принудительно или при переустановке приложения.

2. Ключ подписи (Signed key pair) — генерируется при помощи идентифицирующего ключа и периодически изменяется.

3. Набор одноразовых ключей (One-time pre keys) — набор ключей, которые используются для различных нужд, пополняются постоянно.


Из основных ключей генерируются сессионные ключи:

1. Корневой ключ (Root key) — используется для создания цепи ключей.

2. Цепь ключей (Keys Chain) — используется для создания Ключей сообщения.

3. Ключ сообщения (Message Key) — 80-байтовое значение для шифрования сообщений, из них 32 используется для AES-256, 32 для HMAC-SHA256 (подпись) и 16 для IV. Ключ для шифрования сообщений.


При регистрации клиент отправляет на сервер публичные идентифицирующий, подписывающий и одноразовые ключи. Сервер хранит эти ключи, но не имеет к ним доступа. Закрытые части ключей хранятся только на устройстве абонента.


Создание защищенной сессии


Перед тем как общаться, клиенты должны инициализировать сессию. После настройки зашифрованного сеанса, его не нужно перестраивать. Новый сеанс требуется только в случае переустановки приложения или смене устройства одним из пользователей.


Алгоритм создания защищенной сессии:

A — клиент, который инициирует первое соединение

B — клиент, которому нужно доставить сообщение

1. A запрашивает открытые ключи (идентифицирующий, подписывающий и одноразовый (один)) B с сервера.

2. Сервер возвращает эти ключи. Одноразовый ключ удаляется с сервера.

Если на сервере нет одноразовых ключей, а B не может пополнить их (оффлайн), то сервер не вернет публичный одноразовый ключ.

3. A сохраняет ключи B.

4. Из своих и ключей B A получает секретное выражение (secret), которое будет использовано для получения корневого ключа и цепи ключей.

5) A передает слепок своих ключей, чтобы B смог получить идентичное выражение (secret). B удаляет одноразовый ключ, который был использован A для создания секрета.


После этих шагов оба абонента имеют одинаковый secret и генерируют идентичные ключи сессии.


Шифрование сообщений


Для шифрования используется блочный алгоритм шифрования AES-256. Предположу, что дело в более высокой скорости работы и надежности данного алгоритма, чем большинства асимметричных.


Ключ цепи и корневой ключ генерируются алгоритмом Диффи-Хеллмана на эллиптических кривых. Ключ цепи обновляется после каждого использования. Тут есть важный момент, который отмечают сами авторы криптографической системы. Так как цепочка используется для одного сообщения один раз, то сообщения должны приходить в строгой последовательности (цепочка обновляется только вперед). Пока нам не придет предыдущее сообщение, мы не сможем расшифровать следующее.


Вместо заключения


Действия, описанные выше гарантируют, что Ваша переписка останется тайной для всех, кроме Вашего собеседника. Конечно, если Вы не потеряете телефон, т.к. в этом случае сообщения уже будут расшифрованы на Вашем устройстве.


Если Вам интересна данная тематика, то в следующем посте могу рассказать о том, как шифруются прикрепляемые файлы, групповые сессии и голосовые вызовы.


Спасибо Вам за то, что прочитали! :)



Ссылки:

WhatsApp Encryption Overview: https://www.whatsapp.com/security/WhatsApp-Security-Whitepap...

Эллиптическая криптография: теория: https://habrahabr.ru/post/188958/

Небольшая справка о Curve25519: https://habrahabr.ru/post/247873/