2014-11-23 159 views
3

我在我的C#代碼中使用RSACryptoServiceProvider,它運行良好我可以導出RSA XML私鑰和公鑰,但出於某種原因,我需要將此密鑰轉換爲格式爲* .pem(PKCS8未加密)將RSACryptoServiceProvider RSA XML密鑰轉換爲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> 

我想將它轉化成(PKCS8未加密)像下面

-----BEGIN PRIVATE KEY----- 
MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQC0Bo/mh3bSiOiP 
CUxtpa0c8IhDNJqaRDNWaKiqothEjgI7D/IU/uHacPotyedjzLFNr0cnhgguO4dQ 
dNaSN+tAlgBqcexBbAl31+BEghNy+1PB189VNVSf8G+qOfF0SIKuBbb/+Q4TrvOD 
XPrzulQpLcHMqRGqRE4PkT6574pKyiQGJvjeLBLEQtiobKkzoG3HOFkl9RsKae1f 
Tuf8f25aVhKjoUyWp1mOfhHwdfT+76rmrz7F9X1s6M7pxigIfCiYPXHrWh02GTbj 
EVLKTpVBg31JmrKErNJsv/j5P3wuSI12TCW4u1RXfahBHhi263oGCQ/2JO/Fm4+v 
5wtX20x5AgMBAAECggEBAJjceZPlsp9SYSYTXzI7W6MXGpz2LdCP2IemlpFNdRXA 
/2PnRkdNpbk19TisGC5FwMeV7XVB+fBH274Vd5zwnnFY7UF1OobSlbeNNoD1ck5P 
2e7esM5JWnH0VtzUFpIGf/AEKj9v2uQbyenhKbWKoavVjpmZdcZ9+Up+qiR3oZWe 
YiScMlYm5KL+pTD1IMZQ46DoxU17VhOVxbZoZOf+a5iAPtskjJyz12EOVldHASGz 
VZkM54C+BrCTdJjOB5C7cth94D7J7nhgovBP0jz6A7WZtDpgBB6j1lFBwKSWw0U4 
0LGZb/Mlb29txAoeR1YSHCe6RKuyyY3oas6fJ1kdRgECgYEA12r1nkK8fjNybMbp 
No+TsWD9YDTLZrndHBMIR+GtUKWCXTpw7EwT0BCU4ATm6TiTje0ZI9kZW1tnbB4W 
iCIyU8o/OeIBBbqKMLtk2iN82KFrNbIbA4IER0J441evYZTnh9NbkJks8iyATPdC 
hypRiOi1V4n9CFDguGHj+IsKpLUCgYEA1fC65ASTYGhQ5iQ56G48iKV5XIBldKad 
MFcaxzAA/Hp6GMywHqEiYvk/WmCakDmIK1g7Rf7LURvWTYp1nytRBzTRDvrf4ESU 
WF4z5Mr6EcnqKEpqDO/tDCwUp+4BReXMrf99KXRAWYig9zjq8garYEmIznoIc02i 
4Q/X1uu1RzUCgYEAxzQFxj/4hsuUeLrIVsgWz+Tc6eZoYapmqdt/wNkUqIslLoko 
e5suhy2OPkrKLck/yfMDWH8eT7kKvpRkSac12v4f0asJPv7tY3snHAHNJZa/yXvW 
Nzw4MJ1rpPAlIpvML3JoLiM3yQsV6haM0ulzVKO9biIQd2wzIs6DPgd15DECgYEA 
lQ2vaAW4GEcVdgJvRfznt9xx/XyHMwqSIYfOZFCRn1ZFktmpKu3g40v8U59SkIFE 
2c4THeUzCkN2v3dkE40+WuL1dJZdPAcLw7V+Oj0glRw0Q/X0hSbz5LMhgQ5VXLmK 
LP//183it351h0jkh9MVu3QAGLr1AEBq5pr/KgH2vrECgYEAr6y3cCo/gdUi6v3Y 
39B6LTcmqeKZbpqh3LzBl+I6Ke9t/TOqCZhwtuolMDkFLhZ9woGDeB1VBfV7yUW4 
xyF3rE6uMSEZyD5ivku7VC2Gsz/2XuRGl8iToGXgGxzzg6HMQr6Hw36+0VFzzxSo 
xn9/6PuHd1bNooOv1S3s0WVkTJw= 
-----END PRIVATE KEY----- 

我不在此安全STAF專業f,我不確定我們可以將它轉換成不是嗎?任何人都可以幫助代碼示例?

回答

3

您可以使用BouncyCastle C# library來執行此操作。這裏是一個例子:

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

謝謝,你知道爲什麼最終的鍵不被谷歌鉻擴展包程序接受(https://developer.chrome.com/extensions/packaging)嗎?我知道這與問題沒有直接關係,但如果你知道答案,它就會變成廢話。 鉻擴展名.pem文件的規格(http://stackoverflow.com/a/23877974/471499)。 Thankx – 2014-11-24 15:44:22

+1

那麼,你提供的鏈接說你需要使用2048位密鑰來擴展chrome;上面的例子中的關鍵字在1024位。 – 2014-11-24 23:16:17

+0

根據RFC,文件擴展名爲* .p8:https://tools.ietf.org/html/rfc5958.html#section-7.1 – 2015-08-09 18:44:08

相關問題