将私有RSACryptoServiceProvider blob导入CNGKey.Import

时间:2018-07-18 02:47:15

标签: c# cryptography rsa cng

从旧版程序中:

  

bye [] rsaPrivateKeyExport = RSACryptoProvider.ExportCspBlob(true);

这些密钥存储在文件中。

作为旧版刷新的一部分,我需要使用CNG RSA密钥。

类似于读取旧的blob然后进行转换:

  

CngKey cngPrv = CngKey.Import(rsaPrvKeyExport,   CngKeyBlobFormat.GenericPrivateBlob);

但是我无法使它正常工作吗?

如何将旧的Blob类型转换为新的Blob类型?我只使用旧的Blob的一部分吗?

密钥长度为2048。

1 个答案:

答案 0 :(得分:0)

GenericPrivateBlob是CNG特定的格式,并不意味着“尝试任何私人物品”。

CNG能够使用https://docs.microsoft.com/en-us/windows/desktop/api/Bcrypt/nf-bcrypt-bcryptexportkey上标识的格式打开CAPI密钥Blob。

private static readonly CngKeyBlobFormat s_legacyRsaPrivateBlobFormat =
    new CngKeyBlobFormat("CAPIPRIVATEBLOB");

...

byte[] exported;

using (RSACryptoServiceProvider a = new RSACryptoServiceProvider(2048))
{
    exported = a.ExportCspBlob(true);
}

RSA b;

using (CngKey key = CngKey.Import(exported, s_legacyRsaPrivateBlob))
{
    b = new RSACng(key);
}

// This using is broken out here just to show that the constructed object can safely outlive
// the CngKey object that it was created from.
using (b)
{
    ...
}