Архитектура безопасности

Запираем на телефоне,
открываем на телефоне.

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

01 Печать

Открыть могут только те,
кого вы выбрали

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

Путь запечатанного поста: телефон автора, сервер Krypton Ø, телефон читателя
  1. Телефон автора внутри ядра безопасности создаёт новый ключ содержимого только для этого поста.

  2. Этим ключом он запирает текст, фото и видео. Текст сначала дополняется до заданного размера, чтобы не было видно его точной длины.

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

Сервер хранит шифротекст и конверты и передаёт их читателям. Ключ от конверта есть только на телефоне читателя, поэтому сервер открыть их не может.

  1. Телефон читателя внутри ядра безопасности открывает свой конверт и достаёт ключ содержимого.

  2. Этим ключом он отпирает пост и показывает его на экране.

На сервере только шифротекст
Посты, ответы, фото, видео и превью ссылок заперты ещё до того, как попадут на наш сервер.
Конверт для каждого читателя
Ключ к посту кладётся в отдельный конверт для каждого читателя, и открыть его может только телефон этого читателя.
Новый ключ для каждого поста
У каждого поста и каждого ответа свой ключ. Ключ от одного не откроет другой.
Кому доставить, решает ваш телефон
Ваш телефон запечатывает пост для списка Fam, который хранит сам. В этот список попадают только те, кто принял запрос или связался с вами через QR-код или ссылку Fam. Ваша ссылка Fam срабатывает один раз в течение 24 часов: первый, кто её откроет, становится вашим Fam без вашего подтверждения. Отправка ссылки и есть согласие.

Посты запираются XChaCha20-Poly1305. Каждый конверт запечатывается X25519 и вкладывается в общий секрет пары, который устанавливается сразу X25519 и ML-KEM-768.

02 Связи

С кем вы знакомы,
знают только ваши телефоны

Список вашего Fam запечатан на ваших телефонах, и наш сервер не хранит ни того, кто кого привёл, ни того, кто кому что отправил. Запечатанное идёт через почтовые ящики, не привязанные ни к одному аккаунту. Но в момент запроса сервер видит IP-адрес и время, и по ним почтовый ящик можно связать с аккаунтом. О тех, кого команда Krypton Ø приняла напрямую, сервер хранит, что их приняла команда.

Секрет, который знают только два телефона
Когда двое становятся Fam, их телефоны получают общий секрет, которого наш сервер не видит. По нему находит дорогу всё, что идёт между ними.
Почтовые ящики, а не аккаунты
Посты, чаты и визитки попадают в почтовые ящики, не привязанные ни к одному аккаунту, а номера ящиков меняются каждые 30 дней.
Отправитель указан внутри печати
Кто отправил, запечатано внутри вместе с подписью, и телефон получателя эту подпись проверяет.
Приглашения, которых нет в записях
Участники получают приглашения, которые наш сервер выдаёт, не видя их. Когда кто-то вступает, сервер проверяет только, что приглашение настоящее. В сохранённых записях нет того, кто кого привёл, но журналы подключений и запросы в момент вступления могут это показать.

Общие секреты пары запечатываются сразу X25519 и ML-KEM-768, ключи почтовых ящиков выводятся через HKDF-SHA256, а отправители подписывают Ed25519.

03 Ключи

Ключи хранятся
на вашем телефоне

Ваши закрытые ключи лежат в ядре безопасности на вашем телефоне. Это общее ядро приложений для iPhone и Android. Ключи не получает даже код приложения, который рисует экран.

Где на вашем телефоне лежат ключи
Ваш телефон
Приложение Krypton Ø
Экраны приложенияJavaScript
  • Дескрипторы
  • Открытые посты и фото

Закрытые ключи сюда не попадают

Ядро безопасностиRust
  • Четыре закрытых ключа
  • Ключи содержимого
Keychain · Keystore
  • Закрытые ключи под замком
  • Только на этом телефоне
Сервер Krypton Ø
  • Открытые ключи
  • Запертая копия для восстановления
  • Половина для восстановления · хеш указателя
Только на этом телефоне
Хранятся в Keychain на iPhone или в Keystore на Android и никогда не переносятся на другой телефон через резервную копию. Новый телефон получает их только через восстановление.
Приложение видит только дескрипторы
Вместо ключа ядро выдаёт приложению дескриптор. Сам по себе, вне приложения, дескриптор ничего не открывает.
Без номера телефона и почты
Вы вступаете и входите только с помощью ключей на своём телефоне. Номера телефонов и адреса электронной почты мы не собираем.
Распространённые стандарты
Никакой самодельной криптографии: только распространённые стандарты в реализации Rust-библиотек dalek и RustCrypto.
  • X25519
  • ML-KEM-768
  • Ed25519
  • XChaCha20-Poly1305
  • HKDF-SHA256
  • BIP39

04 Восстановление

Телефон потерян,
но аккаунт остался

Задайте PIN-код и запишите на бумагу 18 английских слов. Их предложат при вступлении, или их можно создать позже в настройках. На новом телефоне, когда слова и PIN-код подтвердятся, аккаунт вернётся.

Слова хранятся только на бумаге
Мы показываем 18 слов один раз, когда вы их создаёте, и просим повторить некоторые из них. Создать их можно при вступлении или позже в настройках. Слова не хранятся ни на нашем сервере, ни в облаке, ни на телефоне, и больше мы их не показываем.
И слова, и PIN-код
Ни слова, ни PIN-код по отдельности ничего не открывают. После нескольких неверных попыток PIN-код блокируется, а наш сервер находит аккаунт не по самим словам, а по хешу одностороннего значения, полученного из них.
Время, чтобы остановить
Восстановление завершается после 48 часов ожидания. За это время старый телефон видит запрос и может его отменить.
Того, что есть у сервера, недостаточно
Секрет, который открывает резервную копию, состоит из двух половин: одна на нашем сервере, а другая в словах на вашей бумаге. Даже если забрать весь наш сервер, без слов копию не открыть.

Это 18 слов стандарта BIP39, 192 бита. Даже квантовому компьютеру понадобится 2⁹⁶ попыток. Две половины объединяются через HKDF и открывают резервную копию.

05 Звонки

Звонки, которые остаются
между вами двумя

Говорите с вашим Fam голосом. Голос шифруется между двумя телефонами, а история звонков хранится на каждом из них.

Позвонить может только ваш Fam
Вызов приходит запечатанным через почтовый ящик, который есть только у вас двоих. Наш сервер не записывает, кто кому звонит.
Кто звонит, знает только принимающий телефон
Кто звонит, принимающий телефон расшифровывает сам и показывает на экране вызова. Наш сервер имени звонящего не знает.
Ретранслятор скрывает ваш IP-адрес
Обычно звонки идут через ретранслятор. Он видит IP-адреса обоих телефонов, но не может открыть зашифрованный звук, а собеседник не видит ваш IP-адрес. Если телефон не получил данные ретранслятора, телефоны соединяются напрямую, и тогда каждый может увидеть IP-адрес другого.
Соединение подписано обоими телефонами
Каждый телефон подписывает данные соединения своим ключом. Если что-то подменить по пути, звонок не состоится.

Данные соединения подписываются ключом аккаунта Ed25519 каждого из собеседников.

06 Решаете вы

Что показывать,
решаете вы

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

Блокировка приложения
Заблокируйте Krypton Ø распознаванием лица, отпечатком пальца или паролем телефона. Блокировка срабатывает сразу или через 1, 15 или 60 минут после выхода из приложения. Пока блокировка включена, в переключателе приложений содержимое не видно. Настройка хранится только на вашем телефоне, и наш сервер не знает, пользуетесь ли вы ею.
Кто видит вашу визитку
Ваша визитка запечатана. Выберите «Только Fam» или «Для всех». В любом случае фото в оригинале получает только ваш Fam. Если сузить круг, телефон снова запечатает визитку новым ключом.
Без скриншотов
Экраны в Krypton Ø нельзя снять скриншотом или записать на видео.
Исчезающие посты
Сделайте пост исчезающим, и через 24 часа после появления исчезнут сам пост, его чат и фото.

07 Квантовая стойкость

Трудно взломать
даже квантовому компьютеру

Некоторые атакующие собирают шифротекст уже сейчас, чтобы позже вскрыть его квантовым компьютером. Во внешнем слое, который передаёт ключи выбранным вами людям, Krypton Ø использует сразу проверенное сегодняшнее шифрование (X25519) и постквантовое (ML-KEM-768).

Взломать придётся оба
Секреты из обоих алгоритмов перед запечатыванием объединяются в один. Если в одном найдётся слабость, второй всё равно защитит. Это тот же гибридный подход, который выбрали Signal и iMessage.
Каждый внешний слой запечатан обоими алгоритмами
Каждый внешний слой, передающий ключи, запечатан обоими алгоритмами: запросы в Fam и сообщения, которыми пара договаривается об общем секрете, запечатанные резервные копии, восстановление, пакеты приглашений и жалобы. Посты и чаты в почтовых ящиках пары обёрнуты 256-битным общим секретом пары, полученным так же.
Открытые ключи, которые нельзя подменить
Постквантовый открытый ключ тоже привязан к подписи вашего аккаунта. Если наш сервер или кто-то по пути подменит ключ, подпись не сойдётся, и телефон его не примет.
Шифрование содержимого остаётся надёжным
256-битный XChaCha20-Poly1305, которым запираются посты и фото, и SHA-256 сохраняют достаточную стойкость и против квантовых компьютеров, так что менять их не нужно.

Внешний слой запечатывается сразу X25519 и ML-KEM-768 (стандарт NIST США FIPS 203), а два секрета объединяются через SHA3-256.

Что ещё переводим

  • Подписи (Ed25519) пока не постквантовые. Но поддельная подпись не откроет ничего из прошлого. У каждого аккаунта уже есть ключ подписи ML-DSA (FIPS 204), созданный при вступлении и привязанный к вашей личности, и мы планируем включить подписи, использующие его вместе с Ed25519, до того как практичные квантовые компьютеры станут вероятными.
  • Анонимные приглашения и против квантовых компьютеров продолжают скрывать, чьими они были. Часть, которая защищает их от подделки, перейдёт вместе с подписями.
  • Звук звонка шифруется между двумя телефонами по стандарту WebRTC, и эта часть пока не постквантовая.

08 Боты

Ключ бота
не попадает на наш сервер

Участники KryptonØ+ могут создавать ботов только для отправки. Они присылают сообщения и фото в групповые чаты, где есть их владелец. Ключи бота создаются на телефоне владельца и экспортируются файлом, а запускает бота владелец на своём сервере. Мы не стали делать так, чтобы ботов запускал наш сервер: тогда он мог бы читать чаты, в которых есть боты.

Ключи создаются на телефоне владельца
Ядро безопасности сразу записывает ключи бота в файл ключа. Владелец экспортирует его, и копия на телефоне удаляется. На нашем сервере есть только открытые ключи бота, а собственных ключей владельца в файле нет.
Сервер не знает, чей это бот
Бот создаётся без входа в аккаунт, по анонимному талону KryptonØ+, а ключ для управления ботом не связан с ключом аккаунта владельца. Сервер знает, сколько всего ботов, их открытые ключи, когда создан каждый и сколько сообщений каждый отправляет за день. Приложение получает талон заранее, чтобы сервер не мог связать его с новым ботом по времени, но в первый раз это ещё возможно.
Только в чатах владельца и с меткой
Бот попадает только в групповые чаты, где есть его владелец, и только после того, как владелец один раз подтвердит. Бота, которого добавил кто-то другой, принимающие телефоны отбрасывают. Везде, где видно его имя, стоит метка «Бот», и боту нельзя позвонить или отправить запрос в Fam. Когда владелец выходит, бот выходит вместе с ним. Чтобы считать дневной лимит, сообщения бота идут с его собственным сеансом, поэтому наш сервер видит, в какую метку чата (случайный номер) пишет бот, но не знает, чей это бот и что он пишет.
Владелец может читать эти чаты
Тот, кто запускает бота, хранит секрет каждого чата, где есть бот, как и любой участник этого чата. Наша программа для запуска ботов не забирает сообщения, но изменённая могла бы их читать. Поэтому бот попадает только в чаты, где есть его владелец, и носит метку, чтобы все знали, что он там.

У бота такие же ключи, как у участника: Ed25519 и ML-DSA-65 для личности, X25519 и ML-KEM-768 для запечатывания. У каждого бота есть сертификат, подписанный ключом аккаунта владельца Ed25519, а на нашем сервере его сообщения выглядят как любые другие.

От чего не защитит ни одно приложение

  • Фото, которое получатель сохранил в свою галерею, или снимок экрана другой камерой
  • Человек, которому вы отдали разблокированный телефон
  • Изменённое приложение, через которое владелец достаёт то, что получил
  • Запись звонка, которую собеседник делает сам
  • Телефон, уже захваченный вредоносной программой
  • Тот, кто следит за сетью и по IP-адресу и времени связывает почтовые ящики, звонки или регистрацию с аккаунтом. Krypton Ø не пропускает запросы через ретранслятор, скрывающий IP-адреса
  • Изменённое приложение, которое игнорирует правила на устройстве. Блокировки и лимит на пересылку постов соблюдает приложение получателя, а не наш сервер
  • Утечка секрета между вами и одним человеком из Fam. Этот секрет не меняется со временем, поэтому запечатанные сообщения этой пары, ещё лежащие на сервере (до 90 дней), можно будет открыть

Подробное техническое описание будет опубликовано на GitHub.