Импорт экспортированного CngKey в RSA и его повторный экспорт

Я экспортирую ключ в формате CngKeyBlobFormat.Pkcs8PrivateBlob, затем пытаюсь импортировать эту информацию в новый CngKey, а затем снова пытаюсь экспортировать новый ключ. Проблема в том, что когда вы просто импортируете ключ с помощью CngKey.Import(), вы не можете выбрать ни параметры, ни имя ключа, поэтому я не могу экспортировать его снова, так как параметры по умолчанию не позволяют вам это сделать. Поэтому я написал следующий код:

// Import key into RSACng rsa
var key = rsa.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob);

CngProvider cp = new CngProvider("NewProvider");
CngKeyCreationParameters ckcp = new CngKeyCreationParameters() { ExportPolicy=CngExportPolicies.AllowPlaintextExport, Provider=cp};
ckcp.Parameters.Add(new CngProperty(CngKeyBlobFormat.Pkcs8PrivateBlob.Format, key, CngPropertyOptions.None));
CngKey cngKey2 = CngKey.Create(CngAlgorithm.Rsa, "OldKey", ckcp);

RSACng rsa2 = new RSACng(cngKey2);
var exportedKey = rsa2.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob);
// exportedKey.Equals(key) == true

Я получаю сообщение об ошибке CngKey.Create:

System.Security.Cryptography.CryptographicException: «Неизвестная ошибка «-1073741275».


person karolyzz    schedule 27.07.2018    source источник


Ответы (1)


Странно, что он сообщил о неизвестной ошибке. Это значение равно STATUS_NOT_FOUND ("Объект не найден").

Наиболее вероятная проблема заключается в том, что у вас нет зарегистрированного провайдера с именем "NewProvider". Это не имя контейнера ключей, который он запрашивает, это то, в какую библиотеку он должен отправить ключ.

В 99% случаев вы хотите CngProvider.MicrosoftSoftwareKeyStorageProvider. 1% времени, когда вы хотите CngProvider.MicrosoftSmartCardKeyStorageProvider. Почти неизмеримо мала вам нужна какая-то другая величина.

person bartonjs    schedule 27.07.2018