Как я могу получить открытые/закрытые ключи из X509Certificate2
на основе ECC в CngKey
для использования с ECDsaCng
и ECDiffieHellmanCng
?
В настоящее время я использую пары ключей RSA 2048 для подписи/шифрования. Я делаю это, извлекая сертификаты из X509Store
, где они надежно хранятся с закрытыми ключами, помеченными как неэкспортируемые. Я хотел бы преобразовать текущую реализацию для использования ECDSA и ECDH, чтобы я мог использовать ключи меньшего размера для эквивалентной безопасности.
Я успешно сгенерировал сертификаты ECC с помощью openssl:
openssl ecparam -out private.pem -name prime256v1 -genkey
openssl req -new -key private.pem -x509 -nodes -days 365 -out public.cer
openssl pkcs12 -export -in public.cer -inkey private.pem -out export.pfx
Я успешно установил сгенерированные выше сертификаты в хранилище сертификатов. Я могу получить их по отпечатку пальца, но поставщики криптографии для закрытых и открытых ключей выдают исключения «Алгоритм не поддерживается». Вместо этого я понимаю, что должен использовать ECDsaCng
и ECDiffieHellmanCng
для подписи/шифрования. Но это дело в CngKey
годах.
Bouncy Castle не подходит, потому что он требует, чтобы закрытые ключи можно было экспортировать.
CLR Security вернет мне пару CngKey
через GetCngPrivateKey
, но ее нельзя использовать с ECDsa, поскольку ключ, возвращаемый CLRSecurity, является ключом ECDH. Кроме того, CLR Security не дает мне возможности получить только открытый ключ от X509Certificate2
для проверки подписи (где у меня даже нет или не нужен закрытый ключ подписавшего).
Есть идеи? Я в отчаянии... Мы будем много признательны за любую помощь.