Из неизведанного уголка мозга снова вылезло нечто. Сколько я не смотрел на это, всё равно не знаю чего с этим делать.
Итак, идея: делаем систему обмена сообщениями между двумя клиентами с использованием центрального сервера в которой никто, кроме отправителя и адресата не в способен прочитать сообщения, включая сервер.
Реализация много позаимствовала у авторизации ssh по ключу вместо пароля. Здесь тоже есть сервер который хранит у себя открытые части RSA ключей от каждого клиента. При входе пользователь отсылает серверу свою открытую часть и сервер проверяет, знает ли он такого пользователя с таким ключём. Если знает, то он шифрует им блок мусора и отправляет клиенту. Клиент для авторизации должен расшифровать блок закрытой частью ключа и отправить его назад (опционально: перешифровать блок открытым ключём сервера). В случае успешной аутентификации сервер высылает клиенту подтверждение с запросом ключа для симметричного шифрования на ЭТУ сессию, который зашифрован открытым ключём сервера. В открытом виде в процессе логина идут только два сообщения: о запросе логина и о его подтверждении.
Пусть теперь клиент Вася хочет поговорить с клиентом Вова. Вася стучится на сервер и тот присылает ему открытый ключ Вовы, а Вова получает уведомление о разговоре и открытый ключ Васи. Вася набирает текст сообщения, шифрует его открытым ключём Вовы, упаковывает в структуру для отправки и шифрует симметричным сессионным ключём перед отправкой серверу. Сервер, получив сообщение от Васи, расшифровывает его сессионным ключём Васи, шифрует его сессионным ключём Вовы и отправляет Вове. Вова, получив сообщение, расшифровывает его своим сессионным ключём и вынув из пересылочной структуры текст, расшифровывает его своим закрытым ключём. Ответ проходит туже цепочку, только меняется пара RSA ключей.
Плюсы. Сервер не знает текста сообщения и не хранит его. Ему известен только факт переписки между Васей и Вовой. Стек из 2048 или 4096 RSA ключей и AES-256 кажется мне вполне надёжным для выпроваживания непрошеных читателей. Разумеется, что ни о какой досылке сообщений для ушедшего в оффлайн собеседника и речи быть не может.
Минусы. Не знаю как сделать список собеседников. Сообщения либо будут достаточно короткие, либо мультисегментные, в силу природы асимметричного шифрования, хотя можно организовать переговоры клиентов о симметричном ключе и использовать алгоритм Диффи-Хеллмана с сервером в качестве гаранта. Прикручивание пароля для уверенности, что именно Вася открыл клиент, возможно только шифрованием закрытой части ключа. Следствия: смена пароля - проблема, забыл пароль - больше не пользователь. Следствие из следствия: утеря закрытого ключа приводит к потере аккаунта. Следствие из следствия: утеря закрытого ключа сервера - это просто пиздец системе.
В целом ничего принципиально нового здесь нет, от чего ещё больше удивительно, что ещё никто этого не реализовал. Минусов больше чем плюсов, да. Надо будет на досуге накидать код сервера и клиента.