Этапы работы
Пакеты имеют вид:
* Шифрованный: encrypt#L3eNlEq3LmbHEtC7Wml3uRQQq
- encrypt
- показатель, что сообщение зашифрованно ключом сервера (см.)
- далее пакет имеет то же самое, что и нешифрованный пакет
* Нешифрованный (после регистрации): none#sender#2025_07_01_20_00#8t9SFvRgcV6jOldEbWyq6LCMg#someuser#o0H2FoSOmhG
- sender
- ник отправителя
- 2025_07_01_20_00
- время подписи
- 8t9SFvRgcV6jOldEbWyq6LCMg
- строка с датой подписанная ассиметричным ключом пользователя
- someuser
- ник получателя
- o0H2FoSOmhG
- шифрованное сообщение
* При регистрации: reg#nick#rk4TNhaThMoRUPZEj6vJHY3FZ
- nick
- ник
- rk4TNhaThMoRUPZEj6vJHY3FZ
- ассиметричный публичный ключ пользователя
Ключ сервера - один из пары ключей, которые заранее сгенерированны и поставляются вместе с сервером и клиентом (для защиты от MITM)
- Регистрация в системе
- Пакет шифруется ассиметричным ключом сервера (см. шифр.пакет)
- Передача публичного ключа (для подписи) и ника серверу (см. пакет при регистрации)
- Принятие данных сервером, сохранение в ....
- Сервер отвечает "accepted"
- Вычисление общего симметричного ключа по Диффи-Хеллману
- Передача данных шифруется ассиметричным ключом сервера (см. шифр.пакет), пока не будет вычислен общий симметричный ключ клиент-клиент.
- Отправка запроса на генерацию общего ключа.
- *алгоритм Диффи-Хеллмана*
- Передача данных шифруется ассиметричным ключом сервера (см. шифр.пакет), пока не будет вычислен общий симметричный ключ клиент-клиент.
- Передача сообщения
- Шифрование сообщения (см. нешифрованный пакет)
- Отправка на сервер и принятие его.
- Ожидание N времени пока получатель не спросит: "нет ли чего для меня?"
- Если не спросил - удалить пакет из RAM.
- Если спросил - передать пакет в таком же виде и занести в RAM сообщение для отправителя, что пакет принят.