如何将 RSACng 创建的 public 密钥保存到本地计算机或密钥存储提供程序 (KSP)?
How to persist public key created by RSACng to Local machine or Key Storage provider(KSP)?
我有一对由 RSACng class 生成的 Public 密钥和私钥。我能够将私钥保存到我的本地机器下的 KSP(MicrosoftSoftwareKeyStorageProvider)->(Program Data-> Crypto->RSA->Keys) 中。但是,我无法保存 RSACng 生成的 public 密钥。如何将 RSACng 中的 public 密钥保存到 KSP(MicrosoftSoftwareKeyStorageProvider)?
我已经尝试过使用 CngKey 保留 public 密钥,但它让我感到困惑 'The operation is not supported'。请在下面找到代码。
public static void SaveKeyPairToKSP(KeyGenerationResult keyData, string keyName)
{
var myKSP = CngProvider.MicrosoftSoftwareKeyStorageProvider;
const bool MachineKey = true;
if (!CngKey.Exists(keyName, myKSP))
{
var keyParams = new CngKeyCreationParameters
{
ExportPolicy = CngExportPolicies.AllowArchiving,
KeyCreationOptions = (MachineKey) ? CngKeyCreationOptions.MachineKey : CngKeyCreationOptions.None,
Provider = myKSP
};
keyParams.Parameters.Add(new CngProperty("Length", BitConverter.GetBytes(keyData.KeySize), CngPropertyOptions.None));
keyParams.Parameters.Add(new CngProperty(CngKeyBlobFormat.GenericPrivateBlob.Format, keyData.PrivateBytes, CngPropertyOptions.Persist));
//Here is my public key that i want to store in my KSP
keyParams.Parameters.Add(new CngProperty(CngKeyBlobFormat.GenericPublicBlob.Format, keyData.PublicBytes, CngPropertyOptions.Persist));
CngKey.Create(CngAlgorithm.Rsa, keyName, keyParams);
}
}
但是,使用上面的代码,它会抛出 "The operation is not supported" 异常。
如果仅添加私钥以实现持久性而无需 public 密钥,代码工作正常。
预期结果-> 我想在我的 KSP 中保留 public 密钥和私钥。
实际结果-> 只有私钥被保留。请帮我做同样的事情。提前致谢!你能帮我解决这个问题吗?
Microsoft CNG 不支持导出 public 密钥用于非对称加密,如 https://docs.microsoft.com/en-us/windows/win32/seccng/key-import-and-export
所示
其中指出:
"For BCryptExportKey to create a persisted key pair, the input key BLOB must contain a private key. Public keys are not persisted."
我有一对由 RSACng class 生成的 Public 密钥和私钥。我能够将私钥保存到我的本地机器下的 KSP(MicrosoftSoftwareKeyStorageProvider)->(Program Data-> Crypto->RSA->Keys) 中。但是,我无法保存 RSACng 生成的 public 密钥。如何将 RSACng 中的 public 密钥保存到 KSP(MicrosoftSoftwareKeyStorageProvider)?
我已经尝试过使用 CngKey 保留 public 密钥,但它让我感到困惑 'The operation is not supported'。请在下面找到代码。
public static void SaveKeyPairToKSP(KeyGenerationResult keyData, string keyName)
{
var myKSP = CngProvider.MicrosoftSoftwareKeyStorageProvider;
const bool MachineKey = true;
if (!CngKey.Exists(keyName, myKSP))
{
var keyParams = new CngKeyCreationParameters
{
ExportPolicy = CngExportPolicies.AllowArchiving,
KeyCreationOptions = (MachineKey) ? CngKeyCreationOptions.MachineKey : CngKeyCreationOptions.None,
Provider = myKSP
};
keyParams.Parameters.Add(new CngProperty("Length", BitConverter.GetBytes(keyData.KeySize), CngPropertyOptions.None));
keyParams.Parameters.Add(new CngProperty(CngKeyBlobFormat.GenericPrivateBlob.Format, keyData.PrivateBytes, CngPropertyOptions.Persist));
//Here is my public key that i want to store in my KSP
keyParams.Parameters.Add(new CngProperty(CngKeyBlobFormat.GenericPublicBlob.Format, keyData.PublicBytes, CngPropertyOptions.Persist));
CngKey.Create(CngAlgorithm.Rsa, keyName, keyParams);
}
}
但是,使用上面的代码,它会抛出 "The operation is not supported" 异常。 如果仅添加私钥以实现持久性而无需 public 密钥,代码工作正常。
预期结果-> 我想在我的 KSP 中保留 public 密钥和私钥。 实际结果-> 只有私钥被保留。请帮我做同样的事情。提前致谢!你能帮我解决这个问题吗?
Microsoft CNG 不支持导出 public 密钥用于非对称加密,如 https://docs.microsoft.com/en-us/windows/win32/seccng/key-import-and-export
所示其中指出: "For BCryptExportKey to create a persisted key pair, the input key BLOB must contain a private key. Public keys are not persisted."