Security Architecture / E2EE

E2EE шифрование

Сквозное шифрование сообщений и потокового медиа на базе криптографических протоколов X25519 и AES-256-GCM.

Принцип Zero-Knowledge (Нулевого разглашения)

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

🔒
Приватный X25519 ключ хранится на устройстве в зашифрованном виде с использованием мастер-пароля. В облако бэкенда загружается только зашифрованная копия приватного ключа (для синхронизации между устройствами владельца).

Математика протокола Диффи-Хеллмана (ECDH)

Обмен ключами базируется на кривой Curve25519:

  1. Алиса выбирает случайное секретное число $d_A$ (приватный ключ) и вычисляет публичную точку $Q_A = d_A \cdot G$, где $G$ — базовый генератор кривой.
  2. Боб аналогично вычисляет $Q_B = d_B \cdot G$.
  3. Алиса берет свой приватный ключ $d_A$ и публичную точку Боба $Q_B$, рассчитывая общую секретную точку: $S = d_A \cdot Q_B = d_A \cdot (d_B \cdot G)$.
  4. Боб рассчитывает: $S = d_B \cdot Q_A = d_B \cdot (d_A \cdot G)$.
  5. Полученные точки совпадают ($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) для медиа-пакетов

12-байтный Nonce (AES-GCM)
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 комнаты и участника, не имея ключа для расшифровки медиапотока.