Модель угроз
Считаем сеть и наш собственный сервер враждебными: они могут записывать, задерживать, повторять и менять трафик и отдают справочник ключей. Считаем также, что у будущего противника будет большой квантовый компьютер, а сегодняшний трафик он уже записал («собери сейчас — расшифруй потом»).
Цели: конфиденциальность и целостность содержимого; прямая секретность и восстановление после взлома в переписке 1:1; анонимность отправителя для сервера; никакой незаметной подмены ключей; постквантовая конфиденциальность в каждом слое, который несёт ключи содержимого.
Вне модели: взломанное устройство и анализ трафика глобальным пассивным наблюдателем сверх того, что снижают дополнение размеров, случайная рассылка в группы и Tor.
Примитивы и стандарты
Только стандартизованные примитивы из известных проверенных библиотек; своей криптографии нет. Одно общее ядро даёт одинаковый результат на Android, iPhone и компьютерах.
Личность, код безопасности и прозрачность ключей
У каждого аккаунта гибридная личность для подписи и гибридная — для шифрования. Открытый адрес выводится из постквантового ключа подписи. Код безопасности одинаков у обоих. Версия 2 покрывает все четыре ключа личности — secp256k1, X25519, ML-DSA-65 и ML-KEM-1024 — и используется, когда обе стороны объявили её внутри своих зашифрованных сообщений; со старой версией пара возвращается к версии 1, которая покрывает классические ключи, а постквантовые тогда покрывает журнал прозрачности. Объявленная версия 2 закрепляется: если она пропадёт, приложение предупредит, что ключ изменился, а не откатится молча.
Сервер ведёт журнал Меркла, куда ключи только дописываются. Приложение проверяет вершину, подписанную Ed25519 и ML-DSA-65, и доказательство включения, поэтому справочник не может отдать ключ, которого нет в журнале, — в том числе постквантовый ключ и версию протокола, что не даёт незаметно откатить защиту.
Запечатанный конверт
Каждый конверт 1:1 запечатывается получателю классическим обменом и постквантовой капсулой. Выработка ключа привязана к хешу транскрипта — разового ключа, шифртекста ML-KEM и ключей получателя, — как в X-Wing. Полный конверт несёт свежую капсулу; между ними короткие конверты берут ключи из подтверждённого обеими сторонами секрета пары, который сдвигается по односторонней цепочке, поэтому капсула не повторяется в каждом сообщении. Отправитель едет внутри, поэтому сервер не видит, кто написал, а по адресу — кто получает. Конверты дополняются до классов размера.
Double Ratchet с постквантовым шагом
Внутри конверта сессия Double Ratchet меняет ключи с каждым сообщением. В корневой ключ периодически подмешивается постквантовый секрет, поэтому записанная сегодня переписка останется закрытой, даже если классическую часть сломают потом, а сессия восстанавливается после кражи ключей.
Гибридные подписи
Сообщения, наборы ключей и сертификаты устройств несут две подписи — secp256k1 и ML-DSA-65. Подпись принимается, только если проходят обе, поэтому для подделки нужно сломать обе схемы.
Файлы
Каждый файл шифруется своим случайным ключом после дополнения, поэтому его размер на сервере почти ничего не говорит. Ключ файла идёт получателю завёрнутым тем же гибридом, что и сообщения, — независимо от того, каким каналом идёт описание файла. После доставки сервер удаляет файл.
Группы (MLS)
Группы работают на стандарте MLS с постквантовым набором X-Wing. Постквантовая защита покрывает каждую операцию раздачи ключей — приглашение, добавление и удаление участников и каждую смену эпохи, — а не только первый обмен. Существующие группы переводятся на месте вместе с историей.
Подписи участников MLS — Ed25519, как сегодня определяет стандарт. Поверх них каждый Commit, Proposal и Welcome несёт подпись ML-DSA-65 над кадром MLS и составом, а обычные сообщения каждого отправителя складываются в хеш-цепочку, которую регулярно закрывают контрольные подписи ML-DSA-65. Если участник объявил постквантовые подписи, изменение от его имени без такой подписи отвергается. Телефон подписывает ключом аккаунта, привязанный компьютер — своим ключом устройства, заверенным аккаунтом.
Каждый участник к тому же регулярно сам обновляет свой лист (Commit с UpdatePath), поэтому группа восстанавливается после кражи ключей, даже если никто не входит и не выходит. Участники со старой версией подпись ML-DSA-65 не ставят, их изменения принимаются по одной Ed25519.
Звонки и показ экрана
Медиа шифруется DTLS-SRTP между устройствами, ретранслятор только пересылает шифр. Поскольку согласование ключей в DTLS классическое, каждый кадр звука, видео и экрана шифруется второй раз ключами из гибридного обмена, который едет внутри зашифрованной сквозным шифрованием настройки звонка. Звонок 1:1, перевод на другое устройство и каждая пара в конференции получают свои ключи.
Привязка компьютера
Компьютер показывает QR-код с коротким сроком жизни; телефон выполняет гибридный обмен с привязкой к транскрипту, оба экрана показывают один и тот же 6-значный код, ключи подтверждаются в обе стороны. Затем телефон заверяет собственные долговременные ключи компьютера. Закрытые ключи аккаунта не передаются никогда, а отключённый компьютер стирает свои данные.
Сообщества
В каждом канале свой псевдоним со своими ключами, поэтому каналы нельзя связать ни друг с другом, ни с вашим аккаунтом. Вся асимметрия гибридная — Ed25519 + ML-DSA-65 для подписей, X25519 + ML-KEM-1024 для шифрования, — а приватные каналы шифруют посты, файлы и метаданные сквозным шифрованием.
Доставка и метаданные
Конверты идут на адреса доставки, которые могут вычислить только двое; они не связаны с аккаунтом, а когда новая версия у обеих сторон, выводятся ещё и из постквантового секрета конверта. С ближайшего выпуска адрес пары к тому же меняется каждую неделю; граница одна для всех, поэтому смена не выделяет отдельную переписку. Переход согласуется внутри зашифрованной переписки, а приложение слушает и соседние недели, поэтому на границе и пока устройство было не в сети ничего не теряется. С собеседником на старой версии и у связанных компьютеров адрес пока не меняется. Приложение опрашивает все свои ящики по одному соединению, поэтому сервер, наблюдая вживую, может сгруппировать адреса одного устройства. Пробуждающие уведомления идут на ящик пробуждения устройства, не связанный ни с одним адресом ящика; собеседники узнают его только из сообщений со сквозным шифрованием. Анонимные точки входа не несут токена аккаунта. Размеры дополняются, а сообщение в группу уходит отдельными конвертами в случайном порядке и с небольшой случайной задержкой. Соединение с сервером — TLS 1.3; с включённым Tor сервер не видит IP-адрес, без Tor — видит.
На устройстве
Локальные базы зашифрованы, их ключи держит системное хранилище ключей каждой платформы. Копии ключей и выгрузки переписки шифруются ключом, который Argon2id вырабатывает из вашего пароля.
Почему это стойко
Каждый слой, защищающий ключи содержимого, сводит вместе классический и постквантовый секрет, поэтому он стоек, пока стоек хотя бы один из них. Подписи — конъюнкция: для подделки нужно сломать обе схемы.
Независимого аудита пока нет. Заявки поданы, отчёт опубликуем целиком. Нашли проблему — пишите по контактам из SECURITY.md: исправим, выпустим исправление и расскажем, что было не так.
Проверьте сами
Криптоядро и его тесты открыты под Apache-2.0. Эталонные векторы закрепляют каждый примитив байт в байт. На странице «Доказательство» видно, как идут тесты и что ретранслятор записывает в Wireshark.