【问题标题】:Getting RsaParameters from a base64 string which is in pkcs1 format c#从 pkcs1 格式 c# 的 base64 字符串获取 RsaParameters
【发布时间】:2026-01-14 19:40:01
【问题描述】:

我正在根据给定的证书数据和密钥数据创建自己的 pkcs12 证书。关键数据是一个 base64 编码的字符串。是pkcs1格式的。

            byte[] keyData = null;
            byte[] certData = null;

            if (!string.IsNullOrWhiteSpace(clientCertificateKeyData))
            {
                keyData = Convert.FromBase64String(clientCertificateKeyData);
            }

            if (!string.IsNullOrWhiteSpace(clientCertificateData))
            {
                certData = Convert.FromBase64String(clientCertificateData);
            }

            object key;
            using (var reader = new StreamReader(new MemoryStream(keyData)))
            {
                key = new PemReader(reader).ReadObject();
                var keyPair = key as AsymmetricCipherKeyPair;
                if (keyPair != null)
                {
                    key = keyPair.Private;
                }
            }

            var rsaPrivateKeyParams = (RsaPrivateCrtKeyParameters)key;
            var rsaParameters = DotNetUtilities.ToRSAParameters(rsaPrivateKeyParams);

            var cspParams = new CspParameters
            {
                KeyContainerName = Guid.NewGuid().ToString(),
                KeyNumber = (int)KeyNumber.Exchange,
                Flags = CspProviderFlags.NoFlags
            };

            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
            rsaKey.ImportParameters(rsaParameters);

            X509Certificate2 certificate = new X509Certificate2(certData);
            certificate.PrivateKey = rsaKey;

            var base64Cert = Convert.ToBase64String(certificate.Export(X509ContentType.Pkcs12));

            return base64Cert;

我正在创建一个导入 RsaParameters 的 RSACryptoServiceProvider(第 131 行),然后将其分配给证书的私钥(第 135 行)。我目前正在使用 DotNetUtilities 创建 RsaParameters(第 122 行)。 我想知道是否有任何方法可以使用 .NET 库将 keyData 转换为 RsaParameters。 AsymmetricCipherKeyPair、RsaPrivateCrtKeyParameters 和 DotNetUtilities 来自 Bouncy castle 而 RSACryptoServiceProvider 和 RsaParameters 是 .Net 类。

【问题讨论】:

    标签: .net ssl-certificate rsa


    【解决方案1】:

    如果您的 keyData 是 PKCS#8(未加密)私钥,那么您可以执行以下操作来获取您需要使用 set_PrivateKey 的 RSACryptoServiceProvider。

    using (CngKey cngKey = CngKey.Import(keyData, CngKeyBlobFormat.Pkcs8PrivateBlob))
    {
        CngExportPolicies policy = CngExportPolicies.AllowPlaintextExport;
    
        key2.SetProperty(
            new CngProperty(
                "Export Policy",
                BitConverter.GetBytes((int)policy),
                CngPropertyOptions.Persist));
    
        using (RSA rsaCng = new RSACng(cngKey))
        {
            var cspParams = new CspParameters
            {
                KeyContainerName = Guid.NewGuid().ToString(),
                KeyNumber = (int)KeyNumber.Exchange,
                Flags = CspProviderFlags.NoFlags
            };
    
            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
            rsaKey.ImportParameters(rsaCng.ExportParameters(true));
            ...
        }
    }
    

    否则,真的很难。见Digital signature in c# without using BouncyCastle

    【讨论】:

    • 我在 CngKey.Import 函数中收到“编码或解码操作错误”错误。关键数据字节数组来自一个 base 64 字符串。在解码字符串时,我发现密钥是 RSA PkCS1 私钥。因此,我认为创建 cng 密钥不起作用,因为它没有 pkcs1 格式的 blob 类型
    • @anumita 啊,我读到了,因为你有来自 PFX 的数据,所以它已经是 PKCS8 格式。添加了一个类似问题的链接,其中答案是“这很难,除非你是 PKCS8 或已经是 PFX”。
    【解决方案2】:

    @bartonjs,感谢您的帮助!我能够使用 rsa 参数 PCLCrypto

    包。该软件包也可作为 nuget 软件包使用。它可以将 5 种密钥格式读入 RSAParameters。支持 PKCS1、PKCS8、X509SubjectPublicKeyInfo、CAPI 和 BCrypt

    【讨论】: