E2EE шифрование
Сквозное шифрование сообщений и потокового медиа на базе криптографических протоколов X25519 и AES-256-GCM.
Принцип Zero-Knowledge (Нулевого разглашения)
Сервер бэкенда Chepuhagram спроектирован так, что он никогда не видит сообщения пользователей в открытом виде. Ключи шифрования создаются исключительно на устройствах пользователей и не передаются серверу в чистом виде.
Математика протокола Диффи-Хеллмана (ECDH)
Обмен ключами базируется на кривой Curve25519:
- Алиса выбирает случайное секретное число $d_A$ (приватный ключ) и вычисляет публичную точку $Q_A = d_A \cdot G$, где $G$ — базовый генератор кривой.
- Боб аналогично вычисляет $Q_B = d_B \cdot G$.
- Алиса берет свой приватный ключ $d_A$ и публичную точку Боба $Q_B$, рассчитывая общую секретную точку: $S = d_A \cdot Q_B = d_A \cdot (d_B \cdot G)$.
- Боб рассчитывает: $S = d_B \cdot Q_A = d_B \cdot (d_A \cdot G)$.
- Полученные точки совпадают ($d_A \cdot d_B \cdot G = d_B \cdot d_A \cdot G$). Хеш от координаты X точки $S$ используется в качестве общего 256-битного AES-GCM ключа.
Шифрование файлов (поблочный AES-256-GCM)
Файлы шифруются симметричным ключом AES-GCM, генерируемым индивидуально для каждого файла:
{
"type": "private_message",
"message_type": "image", // или file, video, voice_note
"file_id": "uuid-файла-на-сервере",
"content": "Base64(зашифрованное имя файла или превью)",
"encrypted_key": "Base64(AES_ключ_файла, зашифрованный общим ключом E2EE)"
}
Благодаря этому облачное хранилище видит только бинарный зашифрованный массив байт, а ключ для его расшифровки передается в зашифрованном виде исключительно получателю сообщения.
E2EE в потоковом медиа SCP (Звонки реального времени)
Для аудио- и видеопакетов в протоколе SCP (QUIC/UDP) используется аппаратное шифрование AES-256-GCM в нативном Rust конвейере. Ключевая особенность — предотвращение уязвимости Nonce Reuse при экстремально высокой частоте пакетов.
Формирование 96-битного Nonce (IV) для медиа-пакетов
Bytes 0–5: TimestampMs48 — младшие 48 бит Unix epoch в миллисекундах
Bytes 6–9: Seq32 — uint32: (seqEpoch << 16) | seqNumber
Bytes 10–11: Salt — фиксированная константа 0xAAAA
Такая структура строго гарантирует уникальность Nonce на протяжении более 8000 лет даже при переполнении uint16 seq-счётчика и передаче 120 кадров/сек.
Защита групповых звонков и SFU комнат
В групповых звонках участники согласовывают эфемерные симметричные ключи комнаты. Go SFU медиа-сервер выступает исключительно в роли «глухого» ретранслятора зашифрованных датаграмм по ID комнаты и участника, не имея ключа для расшифровки медиапотока.