Как устроен зашифрованный чат Amorely

Как устроен зашифрованный чат Amorely

Чат Amorely рассчитан на то, чтобы переписку могли прочитать только двое. Сервер хранит сообщения и доставляет их в реальном времени, но не получает текст, который можно открыть из базы.

У каждого устройства есть своя пара ключей ECDH на кривой P-256. Она создаётся в браузере. Публичный ключ можно отдать партнёру. Приватный ключ с устройства не уходит.

Когда вы отправляете сообщение, браузер берёт ваш приватный ключ и публичный ключ партнёра и получает общий секрет длиной 256 бит. Этот секрет используется как ключ AES-GCM. Для каждого сообщения генерируется новый вектор инициализации на 12 байт. В сеть уходят шифротекст, этот вектор, версия и идентификатор устройства отправителя. Алгоритм в полезной нагрузке называется ECDH-P256-AES-GCM.

Сокет доставляет тот же зашифрованный пакет, что записан в базе. Расшифровка происходит уже в браузере получателя, тем же общим секретом. Отдельного ключа «для поддержки» нет: если потеряны оба устройства и резервная фраза, сервис не сможет открыть старые сообщения.

Резервная фраза — 12 слов. Из неё через PBKDF2 (SHA-256, 250 000 итераций) получается ключ AES-256-GCM, которым на устройстве закрываются локальные ключи. Фраза нужна, чтобы восстановить доступ, а не чтобы сервер хранил копию переписки.

Поэтому в базе нет поля с текстом сообщения. Есть шифротекст. Поиск по словам переписки на сервере из этой схемы не сделать: индексировать нечего.

How Amorely’s encrypted couple chat works

How Amorely’s encrypted couple chat works

Amorely chat is built so only the two people in a couple can read it. The server stores messages and delivers them in real time, but it does not receive text that can be opened from the database.

Each device has its own ECDH key pair on the P-256 curve, created in the browser. The public key can be given to the partner. The private key does not leave the device.

When you send a message, the browser uses your private key and your partner’s public key and derives a 256-bit shared secret. That secret is used as an AES-GCM key. Every message gets a new 12-byte initialization vector. What goes over the network is the ciphertext, that vector, a version, and the sender’s device id. The payload names the algorithm ECDH-P256-AES-GCM.

The socket delivers the same encrypted packet that is stored. Decryption happens in the recipient’s browser, with the same shared secret. There is no support key. If both devices and the recovery phrase are lost, the service cannot open old messages.

The recovery phrase is 12 words. PBKDF2 (SHA-256, 250,000 iterations) turns it into an AES-256-GCM key that wraps the local keys on the device. The phrase restores access. It is not a server-side copy of the chat.

So the database has no plaintext message field. It has ciphertext. Server-side search over the conversation does not fall out of this design: there is nothing to index.