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

Никаких изобретений - только изученные примитивы: BIP-39, X25519, HKDF-SHA256, XChaCha20-Poly1305. Вот весь путь, человеческим языком.

12 слов - вся идентичность

Профиль начинается с мнемоники BIP-39 - 12 английских слов, в которых 128 бит энтропии. Слова растягиваются в seed, из него HKDF выводит ключевую пару шифрования. Те же слова на любом устройстве восстанавливают те же ключи: «аккаунта», который надо возвращать, нет - есть только фраза.

Адрес - это публичный ключ

Ваш публичный ключ X25519 в кодировке bech32 с префиксом sk - это и есть адрес: около 60 символов, начинается с sk1. Передаётся текстом или QR-кодом. Нет каталога, где надо регистрироваться, и нет сервера, который сопоставляет имена с людьми.

sk1qsva3e52awafjvedj5ethvc5hs9j4t0ml26m83kn6kycsh9m46rejzha

Сообщение становится конвертом

Текст шифруется один раз случайным ключом сообщения (XChaCha20-Poly1305). Затем этот ключ «заворачивается» в слот для каждого адресата - и всегда ещё в один слот для вас. Поэтому свои отправленные сообщения остаются читаемыми: расшифровка истории - та же операция, что чтение входящих.

Слоты анонимны и перемешаны: адресов в конверте нет, снаружи видны только размеры. Ключ каждого слота согласуется двумя рукопожатиями X25519 - с эфемерным ключом, созданным для этого конверта (forward secrecy), и с постоянным ключом отправителя (аутентификация отправителя).

версия 1 Б ключ отправителя 32 Б эфемерный ключ 32 Б слоты по 48 Б nonce 24 Б шифртекст + тег пейлоад
Устройство конверта (версия 2)

Конверт путешествует как текст

Бинарный конверт заворачивается в base64-блок с рамкой. Он самодостаточен: вставьте его в мессенджер, письмо, пост на форуме или файл - любой канал, доставляющий текст, доставляет сообщения Secret Keeper.

-----BEGIN SECRET MESSAGE V1-----
AlXhZ0Qq7bfPj…base64…M42kLBi6p4Jro
-----END SECRET MESSAGE V1-----

Файлы: контейнер .skf

Файлы используют ту же слотовую схему, но тело шифруется чанками - многогигабайтное видео проходит потоком, не загружаясь в память. Нонсы чанков построены по конструкции STREAM (как в age и Tink): счётчик ловит перестановку и дубли, финальный байт - усечение. Даже имя файла лежит внутри зашифрованного заголовка.

Резервные копии

Копия - файл .skb: настройки, контакты и история в одном контейнере, зашифрованном самому себе, - та же схема, что у зашифрованных файлов, снаружи не прочитать даже адреса контактов. Seed-фразы в копии нет никогда: профиль восстанавливается 12 словами, копия возвращает всё вокруг них.

Что это даёт

Forward secrecy
свежий эфемерный ключ на каждый конверт
Отправитель читает своё
свой слот в каждом отправленном конверте
Нет состояния
ни парных сессий, ни хранения на серверах
Нет user-id
адрес - сам публичный ключ
Две реализации
Dart в приложении, @noble в расширении - сверяются общими тест-векторами

Хотите проверить?

Полная побайтовая спецификация открыта - тот же документ, по которому тестируются приложение и расширение:

Читать спецификацию протокола