Лучший способ инициировать RSACryptoServiceProvider из x509Certificate2? - PullRequest
23 голосов
/ 03 мая 2011

Каков наилучший способ инициировать новый RSACryptoServiceProvider объект из X509Certificate2, который я извлек из хранилища ключей? Сертификат связан как с открытыми (для шифрования), так и с закрытыми (для дешифрования) ключами.

Я использую метод FromXmlString, но должен быть лучший способ.

Спасибо

Ответы [ 3 ]

46 голосов
/ 03 мая 2011
RSACryptoServiceProvider publicKeyProvider = 
    (RSACryptoServiceProvider)certificate.PublicKey.Key;

и

RSACryptoServiceProvider privateKeyProvider = 
    (RSACryptoServiceProvider)certificate.PrivateKey;

Свойство ключа в свойстве открытого или закрытого ключа сертификата имеет тип AsymmetricAlgorithm.

13 голосов
/ 11 апреля 2018

Рекомендованным способом является использование RSA базового класса и вызов certificate.GetRSAPrivateKey().

RSA publicKeyProvider = certificate.GetRSAPrivateKey();

Начиная с .NET 4.6, приведение к RSACryptoServiceProvider, как предложено @blowdartбольше не рекомендуется.Это еще более актуальная проблема, поскольку существует несколько версий .NET (например, .NET Core).

При приведении к RSACryptoServiceProvider таким образом, есть большая вероятность, что вы можете получить это исключение приведения (в зависимости от используемой платформы и библиотек):

Невозможно привести объект типа 'System.Security.Cryptography.RSACng' к типу 'System.Security.Cryptography.RSACryptoServiceProvider'

Причина в том, что фактическая реализация может отличаться для каждой платформы, в Windows используется RSACng.

Вот ссылка, описывающая эту проблему (ищите ответ ДжеремиBarton).

8 голосов
/ 23 мая 2011

Ответ Blowdart действительно правильный.Однако для ясности я должен указать, что если вы хотите, чтобы ваш экземпляр RSACryptoServiceProvider содержал и открытый и закрытый ключи сертификата X509 (при условии, что сертификат имеет закрытый ключ).Проверьте свойство сертификата HasPrivateKey.

RSACryptoServiceProvider rsa;
if (cert.HasPrivateKey)
    rsa = (RSACryptoServiceProvider)cert.PrivateKey;
else
    rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;

В случае RSA, когда присутствует только открытый ключ, параметры RSA будут только Exponent и Modulus, все остальные будут нулевыми;Если, с другой стороны, имеется закрытый ключ, параметры RSA будут содержать D, DP, DQ, экспоненту, InverseQ, модуль, P и Q.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...