2014-11-23 4 views
3

Я использую RSACryptoServiceProvider в своем коде C#, и он работает хорошо, я могу экспортировать частные и открытые ключи RSA XML, но по какой-то причине мне нужно преобразовать этот ключ в * .pem с форматом (PKCS8 зашифрованный)Convert RSAryptoServiceProvider 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----- 

Я не профессионал в этом СТАФЕ безопасности 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

Спасибо, вы знаете, почему окончательный ключ не принимается Google расширения хром пакет proccess (https://developer.chrome.com/extensions/packaging)? Я знаю, что это не связано напрямую с quistion, но это будет noce, если вы знаете ответ. Характеристики chrome extension .pem файл здесь (http://stackoverflow.com/a/23877974/471499). Thankx –

+1

Ну, ссылка, которую вы указали, говорит, что вам нужно использовать 2048-битные ключи для хромовых расширений; ключ в вашем примере выше в 1024-бит. –

+0

Расширение файла * .p8 согласно RFC: https://tools.ietf.org/html/rfc5958.html#section-7.1 –

Смежные вопросы