Вопрос по certificate, c#, rsacryptoserviceprovider, cryptography, .net –  (ищите ответ Джереми Бартоном).

21

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

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

Спасибо

Ваш Ответ

3   ответа
6

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

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

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

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

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

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

43
RSACryptoServiceProvider publicKeyProvider = 
    (RSACryptoServiceProvider)certificate.PublicKey.Key;

а также

RSACryptoServiceProvider privateKeyProvider = 
    (RSACryptoServiceProvider)certificate.PrivateKey;

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

Спасибо Blowdart, работал как шарм. Может быть, я должен купить вашу книгу. Petey B
Ой, мой плохой - отредактированный blowdart
Примечание: должно бытьcertificate.PrivateKey; неcertificate.PrivateKey.Key; Petey B
Ну, эллиптическая кривая также асимметрична, но нет реальной концепции ключей. И, конечно, базовый класс обеспечивает расширяемость, если кто-то выходит с чем-то большим. blowdart
Отличный ответ, короткий и сладкий. Являются ли провайдеры не-RSA просто неактуальными? Предположительно, есть причина, по которой эти свойства являются AsymmetricAlgorithm, и нет гарантии, что их тип времени выполнения на самом деле будет RSACryptoServiceProvider ..? The Dag
8

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

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

Похожие вопросы