如何将 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."