RSACryptoServiceProvider rsa = (RSACryptoServiceProvider) cert.PublicKey.Key не работает в. NET Core - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть сборка, скомпилированная с помощью. NET Framework 2.0 (да, довольно старые вещи), которая выполняет шифрование с помощью открытого ключа c сертификата. Код очень прост:

X509Certificate2 objCert = new X509Certificate2(path);
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)objCert.PublicKey.Key;
byte [] EncrRes = rsa.Encrypt(data, false);

Это продолжает работать со всеми последними версиями. NET Framework, но отказывается работать в. NET Core. Я получил два разных, но похожих сообщения об ошибках.

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

Linux: Невозможно выполнить приведите объект типа 'System.Security.Cryptography.RSAOpenSsl' к типу System.Security.Cryptography.RSACryptoServiceProvider '.

Есть ли способ кодирования этой простой операции, чтобы она работала в обоих случаях. NET Framework 2.0+ и. NET ядро?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

In. NET Core, X509Certificate2.PublicKey.Key и X509Certificate2.PrivateKey используют платформу-указанную c реализацию ключа. На Windows существует две реализации: устаревшая RSACryptoServiceProvider и современная RSACng.

. Вам необходимо изменить способ доступа к этим свойствам. И не получить к ним доступ. Вместо этого используйте методы расширения: X509Certificate2 Методы расширения . Они возвращают безопасные абстрактные классы, которые вы должны использовать. Не пытайтесь использовать явное приведение к чему-либо. Для ключей RSA используйте класс RSA и т. Д.

X509Certificate2 objCert = new X509Certificate2(path);
// well, it is reasonable to check the algorithm of public key. If it is ECC,
// then call objCert.GetECDsaPublicKey()
RSA rsa = objCert.GetRsaPublicKey();
byte [] EncrRes = rsa.Encrypt(data, RSAEncryptionPadding.Pkcs1);
0 голосов
/ 06 февраля 2020

Разобрался сам. Вместо

RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)objCert.PublicKey.Key;

do

RSA rsa_helper = (RSA)objCert.PublicKey.Key;
RSAParameters certparams = rsa_helper.ExportParameters(false);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
RSAParameters paramcopy = new RSAParameters();
paramcopy.Exponent = certparams.Exponent;
paramcopy.Modulus = certparams.Modulus;
rsa.ImportParameters(paramcopy);

Работает с. NET 2.0+ и. NET Core!

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