Коротко
- Каждое сообщение запечатывается на телефоне отправителя сразу двумя алгоритмами: X25519 и постквантовым ML-KEM-1024 (Kyber). Чтобы прочитать, нужно взломать оба.
- Сервер получает адрес ящика и шифротекст. Ни текста, ни отправителя, ни получателя в нём нет.
- Звук и видео шифруются DTLS-SRTP между двумя телефонами. Ретранслятор пересылает пакеты, которые не может открыть.
- Всё это проверяется: код на GitHub, 7 тестов запускаются одной командой, звонок проверяется в Wireshark.
Сообщения: как запечатывается каждое
Текст сначала шифруется сессией Double Ratchet — у каждой переписки свои ключи, и они меняются с каждым сообщением. Потом вместе с данными отправителя он упаковывается во внутренний пакет — так отправитель оказывается внутри шифра.
Этот пакет запечатывается получателю: на каждое сообщение создаётся новый одноразовый ключ X25519 и делается инкапсуляция ML-KEM-1024. Оба секрета сводятся в один ключ через HKDF-SHA256, а пакет закрывается AES-256-GCM. Результат дополняется до фиксированного размера.
Отправитель едет внутри шифротекста. Ретранслятор не видит ни отправителя, ни получателя.
- 1. Ratchetшифрует сообщение
- 2. Внутренний пакетотправитель + сообщение ratchet
- 3. ЗапечатываниеX25519 + ML-KEM
- 4. Дополнениекорзины размера
- 5. Доставкаадрес ящика
ss₁ = X25519(eph_priv, recipient_x25519)ss₂ = ML-KEM-1024.Encaps(recipient_kyber)k = HKDF-SHA256(ss₁ ‖ ss₂, salt = HYBRID_LABEL, info = "key-derivation", 64)[0..32]box = AES-256-GCM(k, iv₁₂, inner) → { ephemeralPublicKey, kyberCiphertext, iv, encryptedInner, authTag }Что видит сервер
Мы специально показываем и то, что сервер видит. Доказательство, которое скрывает неудобное, — это реклама.
7 тестов, которые запускает любой
В репозитории лежит файл tests/proof.rs. Он воспроизводит ту самую печать, которой закрывается каждое сообщение, и проверяет каждое утверждение. Например:
Ключ X25519 получателя у атакующего есть, ключа ML-KEM — нет. Сообщение не открывается.
Тест моделирует будущий квантовый компьютер, который взломал X25519. Без ключа ML-KEM-1024 сообщение всё равно не открывается.
Проверьте сами — три команды
Нужен только Rust. Сборка и тесты идут на Linux, macOS и Windows. rustup.rs
Результат на нашем компьютере. На вашем должно быть то же самое.
Звонки: ключи только у двух телефонов
Звук и видео шифруются DTLS-SRTP — это шифрование, встроенное в WebRTC. Рукопожатие DTLS идёт прямо между двумя телефонами. Если прямое соединение невозможно, пакеты идут через ретранслятор (TURN): он не участвует в рукопожатии и ключей не имеет. Групповые звонки соединяют участников напрямую.
Ключи звонка создаются на двух телефонах. Ретранслятор пересылает зашифрованные пакеты, которые не может открыть.
- Звук и видео шифруются DTLS-SRTP прямо между двумя телефонами.
- Ключи не покидают телефоны. Ретранслятор и сеть видят только зашифрованные пакеты.
- Настройка звонка (SDP и отпечатки ключей) зашифрована сквозным шифрованием и подписана звонящим, затем доставляется тем же анонимным каналом, что и сообщения.
- Сервер не может прочитать или изменить настройку звонка, поэтому не может встать посередине.
- Описание звонка (SDP с отпечатками DTLS) шифруется как обычное сообщение.
- Чужая или изменённая подпись — звонок не устанавливается. Сервер не может встать посередине.
Проверка звонка в Wireshark
- Подключите телефон к Wi-Fi, который вы контролируете, и запишите его трафик Wireshark — например, на ноутбуке, раздающем интернет.
- Сделайте звонок в Umbera.
- Поставьте фильтр, указанный ниже.
- Вы увидите рукопожатие DTLS и дальше только зашифрованные пакеты SRTP.
Честные допущения
Доказательство честно ровно настолько, насколько честны его условия.
Телефоны участников не заражены
Вирус на устройстве видит экран — от этого не защитит ни один мессенджер.
Получатель сам не пересылает переписку
Шифрование не может запретить человеку поделиться тем, что он получил.
Стандартные алгоритмы надёжны
ML-KEM-1024, X25519, AES-256-GCM, HKDF-SHA256, DTLS-SRTP — стандарты NIST и IETF. Свои шифры мы не изобретаем.
Ключи важного контакта сверены
Прозрачность и закрепление ключей предупредят, если ключи собеседника сменились.
Что опубликовано
Криптографическое ядро на Rust — те же библиотеки RustCrypto, dalek и OpenMLS, что и в приложениях, — и протокольный слой на Kotlin. Сервер и интерфейс приложения в репозиторий не входят.
Лицензия PolyForm Strict 1.0.0: читать, собирать, запускать тесты и проверять может любой.
Нашли уязвимость?
Если вы сможете опровергнуть хотя бы одно утверждение, мы хотим узнать об этом первыми. Отвечаем на каждое сообщение. Как сообщить — в файле SECURITY.md
Приватность, которую можно проверить
Без номера телефона и почты. Постквантовое шифрование каждого сообщения.