Итак, я пытаюсь выполнить обмен ключами, используя методы OpenSSL EVP для эллиптической кривой DH, чтобы получить общий секрет. Это необходимо для обеспечения надежной безопасности с использованием AES в режиме GCM для пользовательского протокола.Эфемерный ECDH (ECDHE) с использованием OpenSSL EVP
Проблема в том, что я могу только найти информацию и примеры об обмене статическими ключами (ECDH) (см. here).
Чтобы сделать обмен ключами «эфемерным», выполняю ли я следующее?
- Сформировать новый «эфемерный» публичный и закрытый ключ на сервере (pub_s_e, priv_s_e) и на клиенте (pub_c_e, priv_c_e) с использованием
EVP_PKEY_keygen
- Подписать новые эфемерные открытые ключи с основным закрытым ключом на как клиент и сервер (знак pub_s_e с priv_s на сервере, pub_c_e с priv_c на клиенте), используя функции
EVP_DigestSign
. - Обмен подписанными эфемерными открытыми ключами между клиентом и сервером (может быть в открытом виде).
- Аутентификация эфемерного открытого ключа сервера с известным основным открытым ключом для сервера, аутентификация эфемерного открытого ключа клиента с известным общедоступным ключом для клиента с использованием функций
EVP_DigestVerify
. - Выполните ECDH для получения общего секрета, хеш его (чтобы удалить слабые биты) и используя функцию деривации ключа, например
EVP_BytesToKey
, чтобы получить ключ шифрования и вектор инициализации (IV) для AES. - Зашифруйте, как обычно, с помощью производного ключа и IV.
Это, казалось бы, обеспечит идеальную прямую секретность, поскольку компромисс между главными ключами позволит подписать будущие ключи, но не позволит извлекать прошлые эфемерные ключи.
Я ничего не пропустил?