(ищите ответ Джереми Бартоном).

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

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

Спасибо

Ответы на вопрос(3)

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

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

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

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

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

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

казать, что если вы хотите, чтобы ваш экземпляр 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, Exponent, InverseQ, Modulus, P и Q.

 The Dag08 мар. 2012 г., 14:02
(RSACryptoServiceProvider) (c.HasPrivateKey? C.PrivateKey: c.PublicKey.Key); Однако: я бы никогда этого не сделал. Я бы загружал закрытый ключ только тогда, когда намеревался использовать провайдера для чего-то, чтотребует это - и тогда, конечно, это не поможет просто загрузить открытый ключ вместо этого.
Решение Вопроса
RSACryptoServiceProvider publicKeyProvider = 
    (RSACryptoServiceProvider)certificate.PublicKey.Key;

а также

RSACryptoServiceProvider privateKeyProvider = 
    (RSACryptoServiceProvider)certificate.PrivateKey;

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

 Petey B03 мая 2011 г., 19:10
Спасибо Blowdart, работал как шарм. Может быть, я должен купить вашу книгу.
 blowdart03 мая 2011 г., 21:42
Ой, мой плохой - отредактированный
 Petey B03 мая 2011 г., 19:42
Примечание: должно бытьcertificate.PrivateKey; неcertificate.PrivateKey.Key;
 blowdart10 мар. 2012 г., 07:25
Ну, эллиптическая кривая также асимметрична, но нет реальной концепции ключей. И, конечно, базовый класс обеспечивает расширяемость, если кто-то выходит с чем-то большим.
 The Dag08 мар. 2012 г., 13:54
Отличный ответ, короткий и сладкий. Являются ли провайдеры не-RSA просто неактуальными? Предположительно, есть причина, по которой эти свойства являются AsymmetricAlgorithm, и нет гарантии, что их тип времени выполнения на самом деле будет RSACryptoServiceProvider ..?

Ваш ответ на вопрос