В мессенджере Чепухаграм конфиденциальность переписки обеспечивается строгими математическими законами. Никакие третьи лица, включая разработчика и администратора сервера, не могут получить доступ к содержимому ваших чатов. Данный документ подробно описывает криптографический стек, жизненный цикл сообщений и механизмы синхронизации данных.
Согласование общего ключа на базе эллиптических кривых (Curve25519) без передачи секрета по сети.
Симметричное шифрование блоков данных с проверкой целостности и подлинности (AEAD).
Криптографическая деривация ключей из мастер-пароля с использованием 600,000 итераций.
Реалтайм-доставка сообщений и локальное структурированное хранение истории в зашифрованном виде.
С сквозным шифрованием (E2EE) ваши сообщения кодируются непосредственно перед отправкой на вашем устройстве и могут быть декодированы только на устройстве получателя. Серверная часть мессенджера Чепухаграм полностью изолирована от ключевой информации. Сервер функционирует исключительно как маршрутизатор зашифрованных бинарных пакетов и не способен восстановить исходный текст.
Для создания защищенного канала используется протокол Диффи-Хеллмана на эллиптических кривых. Ниже представлена схема независимого вычисления общего секрета:
(сервер транслирует только открытые ключи)
При первом входе или настройке аккаунта приложение генерирует на устройстве пару асимметричных ключей X25519. Приватный ключ надёжно сохраняется во внутреннем изолированном хранилище ОС (Secure Storage / KeyStore / Keychain), а публичный отправляется в базу данных сервера для обеспечения доступности вашего контакта другим пользователям.
Когда вы открываете чат с пользователем, клиентское приложение автоматически запрашивает публичный ключ собеседника с сервера. Используя его совместно со своим приватным ключом, алгоритм ECDH вычисляет уникальный симметричный ключ (общий секрет). Он никогда не передаётся по сети — обе стороны получают абсолютно одинаковый ключ математическим путём.
Полученный общий секрет передается в алгоритм шифрования AES-256 в режиме Galois/Counter Mode. Каждое сообщение шифруется с использованием уникального вектора инициализации (Nonce), что делает невозможным проведение атак на основе повторяющихся шифротекстов.
Каждое текстовое сообщение шифруется с генерацией случайного 12-байтового вектора инициализации (IV / Nonce). Режим GCM гарантирует аутентифицированное шифрование (AEAD): к шифротексту добавляется 16-байтовый тег аутентификации (MAC), подтверждающий, что данные не были изменены при транзите через сервер.
Итоговая структура пакета сообщения на сервере выглядит следующим образом:
Пример реализации алгоритмов шифрования и расшифрования в приложении на Dart с использованием криптографических библиотек:
// Шифрование строки текста на общем ключе
Future<String> encryptMessage(String plainText, SecretKey sharedKey) async {
final algorithm = AesGcm.with256bits();
final clearTextBytes = utf8.encode(plainText);
// Генерация случайного вектора инициализации (Nonce)
final secretBox = await algorithm.encrypt(
clearTextBytes,
secretKey: sharedKey,
);
// Объединяем nonce, mac-тег и зашифрованные байты в один пакет
final combinedBytes = BytesBuilder()
..add(secretBox.nonce)
..add(secretBox.mac.bytes)
..add(secretBox.cipherText);
return base64Encode(combinedBytes.toBytes());
}
// Дешифрование сообщения на клиенте
Future<String> decryptMessage(String base64Data, SecretKey sharedKey) async {
final rawData = base64Decode(base64Data);
if (rawData.length < 28) throw Exception("Пакет данных слишком мал");
final nonce = rawData.sublist(0, 12);
final mac = rawData.sublist(12, 28);
final cipherText = rawData.sublist(28);
final algorithm = AesGcm.with256bits();
final decryptedBytes = await algorithm.decrypt(
SecretBox(cipherText, nonce: nonce, mac: Mac(mac)),
secretKey: sharedKey,
);
return utf8.decode(decryptedBytes);
}
Шифрование больших файлов целиком в оперативной памяти мобильных устройств приводит к её переполнению и сбоям. Кроме того, это лишает возможности начать воспроизведение видео/аудио до окончания полной загрузки файла. В мессенджере Чепухаграм внедрена технология поблочного крипто-стриминга:
fileKey). Это позволяет безопасно делиться ключом конкретного файла, не компрометируя общий секрет чата.fileKey зашифровывается с помощью AES-GCM на основном общем ключе чата (sharedSecret). Этот зашифрованный ключ прикрепляется к сообщению как поле encrypted_key.fileKey.Преимущество стриминга: При скачивании получатель расшифровывает блоки на лету по мере их поступления по сети. Плеер приложения начинает воспроизведение видео- или аудиофайла мгновенно, не дожидаясь полной загрузки сотен мегабайт с Google Drive.
Потеря устройства или очистка приложения без резервной копии привела бы к безвозвратной потере всей переписки, так как приватный ключ X25519 существует в единственном экземпляре на смартфоне. Для решения этой проблемы Чепухаграм реализует безопасную схему резервного копирования ключей:
encrypted_private_key) отправляется на сервер. При авторизации на новом устройстве пользователь вводит свой мастер-пароль, приложение заново производит 600,000 итераций деривации ключа, скачивает защищённый контейнер с сервера и успешно расшифровывает приватный ключ локально.Чепухаграм спроектирован для бесшовной работы на нескольких устройствах одного пользователя. Это требует сложной логики синхронизации сообщений, прочтений и статусов через реалтайм WebSocket-каналы и локальную СУБД (Drift SQLite):
При чтении переписки на одном устройстве, состояние непрочитанных сообщений синхронизируется на всех остальных девайсах пользователя с точностью до чата:
read_all_chat с указанием ID контакта.all_chat_read всем активным сессиям (устройствам) читателя и автора сообщений.0, очищая бейджи непрочитанных в списке чатов.read_receipt. Сервер вычисляет количество оставшихся непрочитанных сообщений **строго в рамках данного чата** и рассылает его устройствам, предотвращая некорректное суммирование глобального счётчика.Выход из сессий на других устройствах происходит исключительно при смене мастер-пароля шифрования секретного ключа (или при полном сбросе ключей). Это гарантирует своевременное прекращение доступа к аккаунту при изменении ключевого секрета:
session_id) устройства, инициировавшего операцию.sessions базы данных.kill_session_socket в менеджере WebSocket-соединений.{"type": "session_terminated"}, после чего сокеты принудительно закрываются.chat_app.db), токены авторизации, приватный ключ и возвращаются на экран входа.Безопасность при выходе: При логауте база данных SQLite на компьютере или телефоне полностью стирается на уровне файловой системы. Это исключает возможность физического извлечения переписки с диска устройства после выхода из учётной записи.