Получение закрытого ключа RSA с. NET Core - PullRequest
0 голосов
/ 22 февраля 2020

Вкл. NET Core (3.1) на платформах Windows и Linux. Я хочу расшифровать сообщение, используя закрытые ключи экземпляров X509Certificiate2. Сертификаты извлекаются из хранилища сертификатов на платформе Windows и из файла PFX на Linux платформах соответственно.

I wi sh для расшифровки сообщения с использованием чего-то вроде:

static byte[] Decrypt(byte[] data, RSAParameters privateKey)
{
    using (var rsa = RSA.Create())
    {
        rsa.ImportParameters(privateKey);
        return rsa.Decrypt(data, RSAEncryptionPadding.OaepSHA256);
    }
}

Но когда я пытаюсь извлечь закрытый ключ, у меня возникает исключение: «System.Security.Cryptography.CryptographicException: запрошенная операция не поддерживается.»

var privateKey = x509cert.GetRSAPrivateKey();
var privateKeyParams = privateKey.ExportParameters(true); // <-- throws CryptographicException

Чего мне не хватает?

1 Ответ

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

Измените сигнатуру вашего собственного метода Decrypt, чтобы он принял экземпляр класса RSA во втором параметре. Вы выполняете дополнительную работу, экспортируя закрытый ключ в открытый текст, а затем импортируете его в другой объект просто для расшифровки.

var privateKey = x509cert.GetRSAPrivateKey();

эта строка уже возвращает экземпляр класса RSA. То есть весь ваш код упрощен до:

using (var rsa = x509cert.GetRSAPrivateKey())
{
    return rsa.Decrypt(data, RSAEncryptionPadding.OaepSHA256);
}

Исключение выдается, потому что ваш закрытый ключ не экспортируется. И вам не нужно иметь экспортируемый ключ.

...