Курс «Архитектура мессенджера» · Часть 5 · Протоколы безопасности

Раздел 18. Групповое E2EE

Почему шифровать группу сложнее, чем диалог; подход sender keys и идея MLS; что происходит с ключами при добавлении и удалении участника.

В диалоге всё просто: Алиса и Боб через X3DH (Extended Triple Diffie–Hellman) добыли один общий секрет, дальше Double Ratchet крутит ключи — два человека, один защищённый канал. А теперь добавим в чат ещё 50 человек. Сквозное шифрование — E2EE (End-to-End Encryption — «шифрование от конца до конца») — в группе устроено заметно сложнее, и этот раздел объясняет, почему и что с этим делают.

Почему группа сложнее диалога

Корень сложности один: шифровать приходится для каждого получателя отдельно. В диалоге получатель один. В группе их много — и наивное решение выглядит так: Алиса берёт своё сообщение и шифрует его отдельно под каждого участника (зашифровать для Боба, отдельно для Кати, отдельно для Димы…).

Для маленькой группы терпимо. Но это не масштабируется: в группе на N человек одно сообщение превращается в N шифрований, и так на каждое сообщение. Группа на 1000 человек — тысяча шифрований на одно сообщение от одного отправителя. Неподъёмно.

Аналогия: представь, что одно и то же секретное письмо ты переписываешь и отдельно запечатываешь для каждого из 50 друзей — и так заново при каждом сообщении.

Sender keys: как сделать дёшево

Решение — sender keys («ключи отправителя»). Идея: вместо того чтобы шифровать каждое сообщение заново под каждого, у каждого отправителя есть свой групповой ключ. Он один раз раздаёт этот ключ всем участникам (через уже готовые защищённые попарные каналы из Разделов 15–16), а дальше шифрует каждое сообщение этим ключом только один раз — и все участники уже могут его расшифровать, ведь копия ключа у них есть.

Конкретно по шагам:

  1. Алиса создаёт свой ключ отправителя.
  2. Один раз рассылает его каждому участнику по защищённым личным каналам.
  3. Дальше каждое сообщение шифрует этим ключом однократно.
  4. Каждый участник расшифровывает своей копией ключа.

То есть дорогую попарную раздачу платим один раз (при распространении ключа), а потом шифрование каждого сообщения — дёшево. Так устроено сквозное шифрование больших групп в WhatsApp.

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

Что происходит при смене состава

Самое каверзное — когда участники приходят и уходят.

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

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

Аналогия с сейфом: если кто-то ушёл из группы, он унёс копию ключа. Значит, надо сменить замок и раздать новые ключи всем оставшимся.

Почему это плохо масштабируется и при чём тут MLS

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

На это придумали MLS (Messaging Layer Security — «безопасность на уровне сообщений») — современный стандартный протокол специально для группового сквозного шифрования. Его главная идея без математики: вместо того чтобы раздавать ключи каждому по списку (это операций по числу участников, N), MLS раскладывает участников в «дерево». Благодаря этому добавление, удаление и перевыдача ключей стоят примерно по высоте дерева — то есть около log N вместо N. Перевыдать ключи в группе на 10 000 человек становится дёшево, а не «десять тысяч операций».

Это и есть направление, в котором движется защищённое групповое общение.

Связки с курсом

  • Раздел 11 (fan-out): доставка в группу — это размножение, а групповое E2EE добавляет сверху ещё и шифрование под каждого.
  • Раздел 10 (мультидевайс): у каждого участника может быть несколько устройств, и шифровать надо под каждое устройство — это умножает сложность ещё раз.
  • Раздел 17: не случайно секретные чаты Telegram — только 1-на-1: групповое сквозное шифрование заметно тяжелее.

Вопросы интервьюера (с разбором)

«Почему групповое сквозное шифрование сложнее личного?» Образец: «Потому что шифровать надо под каждого получателя, а в группе их много. Наивно одно сообщение превращается в N отдельных шифрований — по числу участников, и так на каждое сообщение. В диалоге получатель один, поэтому всё просто; в группе эта стоимость умножается.»

«Что происходит с ключами, когда участник выходит из группы?» Образец: «У вышедшего остаётся копия групповых ключей, которые ему раздали раньше. Чтобы он не читал будущие сообщения, оставшиеся участники перевыдают ключи отправителя — генерируют новые и заново раздают всем, кто остался. Старый ключ вышедшего к новым сообщениям уже не подходит. Это как сменить замок и раздать новые ключи.»

«Как это масштабируется на большие группы?» Образец: «Базовый приём — sender keys: дорогую попарную раздачу платим один раз, дальше шифруем каждое сообщение однократно. Но смена состава всё равно требует перевыдачи ключей всем, и в больших группах это дорого. Для масштаба используют MLS — он раскладывает участников в дерево, и перевыдача ключей стоит около log N вместо N, поэтому работает даже на десятки тысяч участников.»


#мессенджер #безопасность #групповое-e2ee #sender-keys #mls #подготовка-к-интервью