如何将RSACng创建的公钥持久保存到本地计算机或密钥存储提供程序(KSP)?

时间:2019-04-25 14:41:32

标签: cryptography public-key-encryption public-key rsacryptoserviceprovider cng

我有一个由RSACng类生成的公钥和私钥对。我可以将私钥持久保存到本地计算机->(程序数据->加密-> RSA->密钥)下的我的KSP(MicrosoftSoftwareKeyStorageProvider)中。但是,我无法持久保存由RSACng生成的公钥。如何将RSACng中的公钥持久保存到KSP(MicrosoftSoftwareKeyStorageProvider)?

我已经尝试使用CngKey保留公共密钥,但是这使我“不支持该操作”。请在下面的代码中查找。

  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);
        }
    }

但是,使用上面的代码,它引发了“不支持该操作”的异常。 如果仅添加私钥只是为了持久而没有公钥,则代码可以正常工作。

预期结果->我想在我的KSP中保留公钥和私钥。 实际结果->仅保留私钥。请同样帮我。提前致谢!你能帮我这个忙吗?

1 个答案:

答案 0 :(得分:1)

Microsoft CNG不支持导出公共密钥以进行不对称加密,如https://docs.microsoft.com/en-us/windows/win32/seccng/key-import-and-export

所示。

其中指出: “为了使BCryptExportKey创建一个持久密钥对,输入密钥BLOB必须包含一个私钥。公共密钥不持久化。”