Я бы рекомендовал использовать существующую реализацию S / MIME (или CMS) с надежным криптографическим модулем для шифрования вашего контента.
S / MIME-конвертированные данные представляют собой удобный формат для хранения зашифрованных данных «в состоянии покоя»: конверт записывает информацию об используемых алгоритмах и ключах, так что эта информация будет доступна авторизованным получателям позже, когда это потребуется.
Кроме того, даже если она не поддерживает «лучшие» алгоритмы (например, согласование ключей ECDH), хорошая библиотека с гораздо меньшей вероятностью будет иметь уязвимости, чем что-то написанное обычным программистом. Поскольку это далеко, далеко более вероятно, что безопасность будет нарушена ошибкой реализации, чем криптоанализом, имеет смысл минимизировать эти ошибки.
В законных протоколах открытые ключи подписываются одним из небольшого числа доверенных издателей, чьи открытые ключи распространяются некоторыми безопасными средствами «вне диапазона». Если у вас уже есть надежные средства для передачи открытого ключа отправителю сообщения, зачем отправлять другой? А если нет, то ты облажался.
TLS и S / MIME зависят от наличия набора известных сертификатов CA на каждом клиенте. Они используются для подписи открытого ключа сервера, чтобы клиент мог обнаружить попытки замены ключей. Протокол не может загрузиться сам; должен существовать безопасный способ распространения «якорей доверия» вне диапазона.
Также обратите внимание, что RSA невероятно медленный по сравнению с симметричными шифрами. Реальные протоколы генерируют «ключ шифрования контента» для симметричного алгоритма, такого как AES, затем используют открытый ключ RSA в качестве «ключа шифрования ключа» для шифрования ключа шифрования контента для сообщения получатель (s).
Итак, основная проблема - надежно передать ваш открытый ключ клиенту. Если вы можете это сделать, то подойдет вариант № 1 или № 2 - при условии, что вы просто используете этот открытый ключ, а не пытаетесь отправить другой «внутриполосный». Фактически, в CMS вариант № 1 называется «транспортом ключей», а вариант № 2 называется «соглашением ключей».
На практике «сервер» может использовать сертификат, выданный центром сертификации, который уже хорошо известен, или клиент может сравнить хеш сертификата с тем, который вы ему сообщаете по телефону, или вырезать в лицо утес или что-то еще. Важно то, что все вашей безопасности зависит от целостности сертификата. Вы должны защитить его от вмешательства.
Хотя Crypto ++ является «отраслевым стандартом», его безопасность зависит от того, как вы его используете. Точно так же, как Джерри сказал Крамеру, «дверь должна быть & hellip; закрыта!"Использование криптографических примитивов в Crypto ++ с плохо разработанным протоколом ни к чему вас не приведет. Вот почему я подчеркиваю использование CMS (протокол более высокого уровня) вместе с хорошим криптографическим модулем (криптографические примитивы).