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

Cryptography 如何将RSACng创建的公钥持久化到本地计算机或密钥存储提供商(KSP)?,cryptography,public-key-encryption,public-key,rsacryptoserviceprovider,cng,Cryptography,Public Key Encryption,Public Key,Rsacryptoserviceprovider,Cng,我有一个由RSACng类生成的公钥和私钥对。我能够在本地机器->(程序数据->加密->RSA->密钥)下将私钥持久化到我的KSP(MicrosoftSoftwareKeyStorageProvider)中。但是,我无法持久化RSACng生成的公钥。如何将RSACng中的公钥持久化到KSP(MicrosoftSoftwareKeyStorageProvider) 我已经尝试使用CngKey持久化公钥,但它抛出了“不支持该操作”。请查找下面的代码 public static void SaveK

我有一个由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中保留公钥和私钥。
实际结果->仅保留私钥。请帮我做同样的事。提前谢谢!您能帮我解决这个问题吗?

Microsoft CNG不支持导出非对称加密的公钥,如中所示

其中指出: 要使BCrypExportKey创建持久化密钥对,输入密钥BLOB必须包含私钥。公钥不会持久化