Конвертировать из RSACryptoServiceProvider в RSACng - PullRequest
0 голосов
/ 05 июня 2018

В настоящее время я использую RSACryptoServiceProvider и хочу перейти на RSACng.Я использую его для подписи данных.Причина изменения в том, что я использую заполнение Pkcs1 и понимаю, что заполнение Pss предпочтительнее.Мы проходим проверки безопасности.

Мой вопрос: как мне создать экземпляр RSACng, чтобы он каждый раз использовал один и тот же закрытый / открытый ключ?

С RSACryptoServiceProvider я делаю:

CspParameters cp = new CspParameters();  
cp.KeyContainerName = "ContainerName";  
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cp);

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

СRSACng, я пробовал это, но я получаю исключение: «Запрошенная операция не поддерживается»

RSACng RSA = new RSACng(CngKey.Create(CngAlgorithm.Sha256, ContainerName));

Мне просто нужно иметь возможность передать имя ключа хранилища, чтобы вместо этого он каждый раз использовал один и тот же ключсоздания нового ключа.

1 Ответ

0 голосов
/ 05 июня 2018

Если вы хотите создать именованный / постоянный ключ RSA с CNG:

private static RSA CreatePersistedRSAKey(string name, int keySizeInBits)
{
    CngKeyCreationParameters creationParameters = new CngKeyCreationParameters
    {
        // This is what an ephemeral key would have had
        // (allows ExportParameters(true) to succeed). Adjust as desired.
        //
        // The default is not exportable (only applies to the private key)
        ExportPolicy =
            CngExportPolicies.AllowExport | CngExportPolicies.AllowPlaintextExport,
    };

    creationParameters.Parameters.Add(
        new CngProperty(
            "Length",
            BitConverter.GetBytes(keySizeInBits),
            CngPropertyOptions.Persist));

    // RSACng will extract the data it needs from this key object,
    // but doesn't take ownership
    using (CngKey key = CngKey.Create(CngAlgorithm.Rsa, name, creationParameters))
    {
        return new RSACng(key);
    }
}

Это пропускает части, в которых вы будете пытаться / перехватывать вызов CngKey.Open или, возможно, захотитеудалите ключ (откройте его с помощью CngKey.Open и вызовите Delete в экземпляре CngKey).

(CngAlgorithm.Rsa было добавлено в net46. Если вы используете более старую версию, то эквивалент будет new CngAlgorithm("RSA"))

...