C# 将RSACryptServiceProvider RSA XML密钥转换为PKCS8

C# 将RSACryptServiceProvider RSA XML密钥转换为PKCS8,c#,security,rsa,rsacryptoserviceprovider,pkcs#8,C#,Security,Rsa,Rsacryptoserviceprovider,Pkcs#8,我在我的C#代码中使用了rsacyptoserviceprovider,它运行良好,我可以导出RSA XML私钥和公钥,但出于某种原因,我需要将此密钥转换为*.pem格式(PKCS8未加密) 我的私钥像 <RSAKeyValue> <Modulus>zYs6baSaRDgLc5fG3/ozwGwS8OAvxd9quE2su+7//Lnz2WuIbe8jMc5kL7p2gsPZUEoB88SFHdGZSYiZJhERDc/1iQ4VsW2/ra8DBW+1m3K33ED

我在我的C#代码中使用了rsacyptoserviceprovider,它运行良好,我可以导出RSA XML私钥和公钥,但出于某种原因,我需要将此密钥转换为*.pem格式(PKCS8未加密)

我的私钥像

<RSAKeyValue>
  <Modulus>zYs6baSaRDgLc5fG3/ozwGwS8OAvxd9quE2su+7//Lnz2WuIbe8jMc5kL7p2gsPZUEoB88SFHdGZSYiZJhERDc/1iQ4VsW2/ra8DBW+1m3K33EDvvI3rJ0NIyuRNuwoYql3hYdY0cdW6Gru9ZARCpptgBSJEiUSPjlzDEXz3RaU=</Modulus>
  <Exponent>AQAB</Exponent>
  <P>89aDVrzNZuDfkCCUR6LKlxHul64zb4EBUN4vr6VZ4LrjEqT6m7+a/8lIrgSK03R1hDdOzeg79eS0OLH5cbe6xQ==</P>
  <Q>18vAJpkwmhDSMjcPAE/4LufpZ6ukaOgkcPj9LngZSQlIt/D19LT/4NqZ2BrukX5bFCL6WPPLrJmmYlG/Jj+NYQ==</Q>
  <DP>whMgoi7PxWyCRDLKEmJNoQQSxQNPyRYCuBzAE6sl6CqXhUVuefx9H81TXb4byMXOqxdiT5zh7IrFrsJo6cv0iQ==</DP>
  <DQ>ylGZAZc2XfvPVo0QX3aadT+xMSVXq5OaNuD6XorzCerOZsZfkuHv1NyeyGHXskkJE0QH+0X3ewdDW4LQ+Ac1gQ==</DQ>
  <InverseQ>v4nkldQ2UKhJUZiyJbKnp2xopzfmreDQTTtGbaF4X0UP5pDGJndmUhj1SHITUAVqwUBa+hSl8TvzcO4IRpkOFg==</InverseQ>
  <D>JopbL9Dj7jO2DfwhGcE/7+4z1P+sZYVhbOJ/p5OGY1x4uUVdBQQIjN++0GY9r4JKnq/p0swAC9nPzMZ0tPsRP7gV5x7fmySlMP4tGpALDHbDgGfN098m2+JqK+/MIMYTAdLbnAcwk/1Lp8mB7Urm/OF/M0LOUzRQ1mwXVXNG/sE=</D>
</RSAKeyValue>
我对保安人员不是很专业,我不确定我们能不能把它转换成不?有人可以帮助您完成代码示例吗?

您可以使用。以下是一个例子:

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.OpenSsl;

namespace DotNetToPkcs8Pem
{
    public class DotNetToPkcs8Pem
    {

        public static void Convert(string privXmlFilename, string privPkcs8Filename) {
            StringBuilder sb = new StringBuilder ();
            string line;
            var xmlIn = new StreamReader (privXmlFilename);
            while ((line = xmlIn.ReadLine ()) != null) {
                sb.Append (line);
            }
            var xmlKey = sb.ToString ();
            var rsa = RSA.Create ();
            rsa.FromXmlString (xmlKey);
            var bcKeyPair = DotNetUtilities.GetRsaKeyPair(rsa);
            var pkcs8Gen = new Pkcs8Generator (bcKeyPair.Private);
            var pemObj = pkcs8Gen.Generate ();
            var pkcs8Out = new StreamWriter (privPkcs8Filename, false);
            var pemWriter = new PemWriter (pkcs8Out);
            pemWriter.WriteObject (pemObj);
            pkcs8Out.Close ();
        }

        public static void Main (string[] args)
        {
            var xmlFile = "exportedDotNetPrivKey.xml";
            var pkcs8File = "privkey.pk8";
            Convert (xmlFile, pkcs8File);
        }
    }
}

谢谢,你知道为什么Google chrome扩展包进程()不接受最后一个密钥吗?我知道这与征服者没有直接关系,但如果你知道答案,那就没有关系了。chrome扩展名.pem文件的规范如下()。谢谢,你提供的链接说你需要使用2048位的chrome扩展键;根据RFC,上面示例中1024位.File扩展名的密钥是*.p8:我只想要完全相反的功能,即从pkcs8格式到RSAKEpair格式。@Varsh:请搜索此站点,如果找不到答案,请发布新问题。
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.OpenSsl;

namespace DotNetToPkcs8Pem
{
    public class DotNetToPkcs8Pem
    {

        public static void Convert(string privXmlFilename, string privPkcs8Filename) {
            StringBuilder sb = new StringBuilder ();
            string line;
            var xmlIn = new StreamReader (privXmlFilename);
            while ((line = xmlIn.ReadLine ()) != null) {
                sb.Append (line);
            }
            var xmlKey = sb.ToString ();
            var rsa = RSA.Create ();
            rsa.FromXmlString (xmlKey);
            var bcKeyPair = DotNetUtilities.GetRsaKeyPair(rsa);
            var pkcs8Gen = new Pkcs8Generator (bcKeyPair.Private);
            var pemObj = pkcs8Gen.Generate ();
            var pkcs8Out = new StreamWriter (privPkcs8Filename, false);
            var pemWriter = new PemWriter (pkcs8Out);
            pemWriter.WriteObject (pemObj);
            pkcs8Out.Close ();
        }

        public static void Main (string[] args)
        {
            var xmlFile = "exportedDotNetPrivKey.xml";
            var pkcs8File = "privkey.pk8";
            Convert (xmlFile, pkcs8File);
        }
    }
}