Если я правильно понимаю, вы хотите создать систему, в которой два пользователя могут инициировать частное общение через сервер, которому они не доверяют.
Это не будет работать.
ВВ сценарии, который вы выложите, сервер может генерировать свою собственную пару ключей и публиковать свой открытый ключ вместо пользовательских.Когда пользователь шифрует сообщение, предназначенное для своего партнера, он не может обнаружить, что сервер заменил свой открытый ключ.Сервер расшифровывает сообщение, представляет его администраторам сервера и повторно зашифровывает его (или какое-то новое изготовленное ими сообщение) с помощью открытого ключа реального партнера и пересылает его по назначению.
Чего здесь не хватаетявляется центром сертификации.Это доверенная третья сторона, которая подписывает цифровой подписью связь между открытым ключом и именем пользователя.Эта привязка называется сертификатом.Таким образом, когда сервер предоставляет открытый ключ клиенту для использования для шифрования, клиент может использовать открытый ключ CA для проверки сертификата и быть уверенным, что открытый ключ, который он собирается зашифровать, принадлежит предполагаемому получателю,и не злоумышленник.
Пользователи должны доверять ЦС, что может быть более приемлемым, чем доверие к администраторам сервера.Но также должен быть защищенный от несанкционированного доступа способ хранения сертификата CA.На практике это часто делается с использованием MAC на основе пароля (код аутентификации сообщения).Или, CA может быть подписан цифровой подписью с закрытым ключом пользователя (никогда не видел это сделано, но это будет работать).Но сложнее было бы получить сертификат CA из надежного источника, минуя ненадежный сервер.
Что касается шифрования секретного ключа с помощью пароля, то это делается очень часто и так же безопасно, как и пароль.вы выбираете.
В качестве альтернативы, если пользователи могут делиться секретом друг с другом вне диапазона, вам не нужно шифрование с открытым ключом.Клиент может зашифровать общий секрет с помощью выбранного пользователем пароля и сохранить зашифрованный текст на сервере.