Как это работает

Как Crocodile оставляет ваши разговоры вашими

Обзор архитектуры и протокола простыми словами. Каждая глава начинается с идеи; откройте «Под капотом», чтобы увидеть технические подробности.

Глава 1

Четыре типа участников

Crocodile распределяет работу так, чтобы ваши слова видели только те, с кем вы общаетесь, а части, которыми управляют посторонние, не видели их никогда.

Ваше приложение

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

Знает: Всё, что вы отправляете и получаете: это ваше.

Хост

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

Знает: IP-адреса участников и кто говорит, но никогда — что именно.

Координационные серверы

Коммутаторы, которые поддерживают волонтёры: хранят профили и пространства, сообщают, кто в сети, и выбирают хостов. Они объединяются в одну сеть.

Знает: Профили, членство и кто в сети, но никогда — что сказано.

Каталог

Телефонная книга координационных серверов, чтобы новые приложения знали, с чего начать. О людях он не знает ничего.

Знает: Только список серверов.

Глава 2

Ваша учётная запись — это ключ, а не пароль

Когда вы устанавливаете Crocodile, приложение создаёт на вашем компьютере случайный секрет длиной 32 байта. Из него получаются два ключа: один для подписи того, что вы публикуете, другой для получения зашифрованных сообщений. Ваш идентификатор — это отпечаток ключа подписи.

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

Под капотом
  • Из 32-байтового зерна получаются ключ подписи Ed25519 и ключ шифрования X25519. Идентификатор — это первые 26 символов base32(SHA-256(открытый ключ подписи)).
  • Каждое устройство публикует подписанную запись устройства с набором предварительных ключей (X25519 + ML-KEM-768), который меняется еженедельно. Старые секреты предварительных ключей удаляются после льготного периода.
  • Номера безопасности позволяют двум людям сравнить ключи по другому каналу, как и в других защищённых мессенджерах.
  • Локальные данные (личность, предварительные ключи, история) хранятся зашифрованными ключом, который защищает хранилище ключей операционной системы.

Глава 3

Поиск самого быстрого сервера

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

Прежде всего сервер доказывает, кто он, а приложение и сервер согласуют ключи для этого соединения. С этого момента даже метаданные, которыми они обмениваются, зашифрованы поверх HTTPS, поэтому это безопасно работает и на домашнем сервере.

Под капотом
  • Каталог перечисляет каждый сервер, подписанный этим же сервером, со скрытым адресом. Приложения проверяют подпись, прежде чем воспользоваться записью.
  • Подписанное приветствие сервера содержит свежее предложение гибридного обмена ключами (X25519 + ML-KEM-768). Приложение сверяет его с ключом из каталога, отвечает и подписывает стенограмму. Каждый следующий кадр зашифрован AES-256-GCM и дополнен.
  • Серверы также отвечают на STUN на двух портах, поэтому приложения узнают свой публичный адрес и тип NAT, не спрашивая Google или Cloudflare.

Глава 4

Серверы, которые не могут лгать о вас

Ваш профиль, создаваемые вами пространства, их приглашения и состав участников — это небольшие записи, подписанные тем, кто их написал. Серверы хранят их и делятся ими, а каждый сервер и каждое приложение проверяет подписи. Сервер может отказаться передать запись, но не может её изменить или выдумать.

Координационные серверы находят друг друга и образуют сеть. Каждую запись хранят несколько серверов, выбранных по хешу, и они копируют изменения друг другу, поэтому сеть продолжает работать, когда любой сервер падает.

Под капотом
  • Записи: профиль, запечатанный список друзей, пространство, приглашение, участник, устройство и заметка. У каждой есть автор, который может её записывать; проверка (подпись, полномочия, версия «побеждает последняя запись») одинакова на серверах и клиентах.
  • Списки друзей зашифрованы только для устройств владельца, а запросы в друзья путешествуют как запечатанные заметки без имени отправителя, поэтому серверы не узнают, кто с кем дружит.
  • Каждая запись принадлежит первым нескольким серверам на кольце согласованного хеширования для её шарда. Владельцы реплицируют записи, догоняют пропущенное по курсорам последовательности и передают записи, когда серверы присоединяются или уходят.

Глава 5

Друг — хост, резервный ждёт

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

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

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

Под капотом
  • Хост запускает в своём приложении небольшой SFU (selective forwarding unit). Каждый участник открывает к нему одно WebRTC-соединение с одной исходящей аудиодорожкой, пятью входящими слотами для говорящих и каналом данных.
  • Слоты для говорящих распределяются по заголовку уровня звука RFC 6464 («last-N»), с переписанными номерами последовательности, чтобы каждый слот оставался одним непрерывным потоком.
  • Предложения и ответы подписываются ключами личности вместе с сессией, эпохой, обоими идентификаторами и отпечатком DTLS, поэтому координационный сервер не может вклиниться посередине.
  • Каждая смена хоста увеличивает номер эпохи; устаревшие предложения игнорируются. Участники, которые не могут достучаться до хоста, сообщают об этом, и как только половина соглашается, хостом становится резервный.

Глава 6

Шифрование слоями

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

Одно сообщение, четыре слоя

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

Готов к квантовым компьютерам

Ключи обмениваются гибридно: X25519, проверенным классическим методом, и ML-KEM-768, новым постквантовым стандартом. Злоумышленнику пришлось бы взломать оба. Это важно, потому что кто-то может уже сегодня записать зашифрованный трафик и ждать, пока квантовый компьютер его расшифрует.

Ключи, которые идут вперёд

Ключ каждого участника вращается, как храповик: после каждого сообщения его заменяет следующий в цепочке, которая идёт только вперёд, а старый удаляется. Тот, кто украдёт ключ сегодня, не прочитает вчерашних сообщений. Каждые 30 минут и каждый раз, когда кто-то выходит, все начинают новую цепочку из новых случайных ключей, поэтому украденный ключ тоже быстро становится бесполезным.

Голос, кадр за кадром

Ваш голос шифруется маленькими кадрами, примерно пятьдесят в секунду, сразу после микрофона и до того, как попадёт в сеть. Кадр, который не удаётся зашифровать, отбрасывается и никогда не уходит в открытом виде. Голос идёт с постоянным битрейтом, поэтому размер пакетов не выдаёт, что вы говорите.

Под капотом
  • Парные секреты (распределение ключей отправителя, синхронизация истории, связывание устройств, каналы с серверами) сочетают X25519 и ML-KEM-768 (FIPS 203) через HKDF-SHA256.
  • У ключей отправителя две цепочки HKDF: текстовая продвигается после каждого сообщения, аудио — каждые 30 секунд. Ключи заменяются каждые 30 минут и при выходе участника и отправляются только на устройства, членство которых приложение само проверило по подписанным записям.
  • Голос: воркер Encoded Transform шифрует каждый кадр Opus алгоритмом AES-256-GCM с аутентифицированным хвостовиком в стиле SFrame (идентификатор ключа, поколение, счётчик).
  • Текст: подписан автором (Ed25519), дополнен по методу Padmé и зашифрован текстовой цепочкой.
  • Запечатанные ящики для устройства используют его текущий предварительный ключ и подписаны отправителем, поэтому даже сообщения для устройств не в сети получают прямую секретность.

Глава 7

Когда прямое соединение невозможно

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

Ретранслятор передаёт пакеты, которые уже зашифрованы сквозным шифрованием: он видит их размер и время, но не содержимое. Разрешение действует час и продлевается только пока оно нужно.

Под капотом
  • Ретранслятор — это стандартный TURN (RFC 5766) на UDP-порту координационного сервера с кратковременными учётными данными. Серверы ограничивают число людей, которые могут им пользоваться.
  • При подключении приложение проверяет свою сеть на двух портах STUN, классифицирует её как открытую, ограниченную (симметричный NAT) или заблокированную и предлагает ретранслятор, когда нужно.
  • Каждое соединение записывает четыре шага (предложение, ответ, сетевой путь, зашифрованный канал), поэтому когда что-то ломается, приложение может сказать где.

Глава 8

Сообщения, которые найдут дорогу

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

  1. Ждёт у вас

    Сообщение попадает в исходящие вашего приложения и показывает маленькие часы.

  2. Друг появляется в сети

    Как только вы оба в сети, ваше приложение передаёт его, запечатанное для устройства друга.

  3. Подтверждено

    Его приложение подтверждает получение, и часы исчезают. Участники, пропустившие сообщения в пространстве, догоняют их у хоста и резервного.

  4. Или почтовый ящик

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

Глава 9

Добавление компьютера

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

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

Глоссарий

Термины, которые встречаются в текстах о безопасности, каждый в одном-двух предложениях.

Сквозное шифрование
Ключи есть только у отправителя и получателей. Всё, что передаёт сообщение между ними, включая серверы, видит лишь перемешанные данные.
Peer-to-peer
Приложения соединяются друг с другом напрямую, а не через центральный сервер.
Постквантовая криптография
Шифрование, созданное, чтобы выдержать будущие квантовые компьютеры, которые могли бы взломать методы, используемые сегодня большей частью интернета. ML-KEM — стандарт, опубликованный NIST в 2024 году.
Прямая секретность
Кража ключа сегодня не открывает старых сообщений, потому что ключи, которыми их шифровали, удалены.
Безопасность после компрометации
После кражи ключа новые случайные ключи вскоре снова отрезают злоумышленника. В Crocodile это происходит в течение 30 минут или сразу, когда кто-то выходит.
Цифровая подпись
Математическая печать, сделанная закрытым ключом. Любой может проверить её открытым ключом, и никто без закрытого ключа не может её подделать.
NAT, STUN и TURN
Домашние роутеры прячут компьютеры за одним публичным адресом (NAT). STUN помогает приложениям узнать свой публичный адрес, чтобы соединиться напрямую; TURN ретранслирует трафик, когда это невозможно.
SFU
Selective forwarding unit пересылает звук каждого говорящего каждому слушателю, не смешивая и не декодируя его. В Crocodile он работает в приложении хоста.
Метаданные
Данные о разговоре, а не его содержание: кто с кем говорит, когда и сколько. Crocodile полностью шифрует содержимое и сокращает метаданные, но часть из них серверы всё ещё видят.

Прочитать полный документ об архитектуре (на английском)