2009-07-22 3 views
7

Ich weiß, dass dies eine ähnliche Frage zu this one ist, aber bevor ich die Bouncey Castle Route hinunter, weiß jemand, ob es möglich ist, eine RSA KeyPair von einem zu laden .pem-Datei, zB:Entschlüsseln mit privaten Schlüssel aus .pem-Datei in C# mit .NET-Crypto-Bibliothek

-----BEGIN RSA PRIVATE KEY----- 
MIIBOgIBAAJBALKzy66nRuof8Fg0ItatyHS9RiDIKH0m5lorKzKn4y5wR6BXpVUv 
ZwnevrAJWBd6EPr/lcV3hjObxD6+q9vmN8ECAwEAAQJAGNcxWwfZrbXe3QPyS9FA 
aindU7U/G5aKssIJcTMxO0UYpGU+WArJbboKeEIE7bpNfhDOKTL7ZL6kWBR1Svlh 
WQIhAOhtx+xXuSrIot59tmXZaypBDjA4n+Xare0ObFLQxWuvAiEAxNMwm6w33bVr 
FHS9slkOh59Le2mgs0uNT6perHaRP48CIGMyRzrlDY/m5SvTtz6slgIIlceawxNU 
Sxp7J1wI4djdAiA6+BchHNjkCP2a9Fr9OydaRMSFpiDqduFQk/enbiKYSwIhANO3 
SQ51oLFtWN9gX3tfKTXflyO6BV8rgPo980d9CEsb 
-----END RSA PRIVATE KEY----- 

direkt mit der .NET 3.5 Krypto-Bibliothek, ohne auf eine 3rd-Party zu gehen oder meine eigene Rolle?

+0

@CraigMcQueen gute Frage ... im Irrtum würde ich denken. –

Antwort

11

http://www.jensign.com/opensslkey/index.html

mit Quelle bei http://www.jensign.com/opensslkey/opensslkey.cs

edit: exzerpiert entsprechender Code:

ersten, extrahiert den Text zwischen der ---- ---- BEGIN und ---- END - --- Abschnitte und base64-decode es in ein Byte-Array (Link oben für Details), dann geben sie an:

//------- Parses binary ans.1 RSA private key; returns RSACryptoServiceProvider --- 
public static RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey) 
{ 
    byte[] MODULUS, E, D, P, Q, DP, DQ, IQ ; 

// --------- Set up stream to decode the asn.1 encoded RSA private key ------ 
    MemoryStream mem = new MemoryStream(privkey) ; 
    BinaryReader binr = new BinaryReader(mem) ; //wrap Memory Stream with BinaryReader for easy reading 
    byte bt = 0; 
    ushort twobytes = 0; 
    int elems = 0; 
    try { 
     twobytes = binr.ReadUInt16(); 
     if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81) 
      binr.ReadByte(); //advance 1 byte 
     else if (twobytes == 0x8230) 
      binr.ReadInt16(); //advance 2 bytes 
     else 
      return null; 

     twobytes = binr.ReadUInt16(); 
     if (twobytes != 0x0102) //version number 
      return null; 
     bt = binr.ReadByte(); 
     if (bt !=0x00) 
      return null; 


//------ all private key components are Integer sequences ---- 
     elems = GetIntegerSize(binr); 
     MODULUS = binr.ReadBytes(elems); 

     elems = GetIntegerSize(binr); 
     E = binr.ReadBytes(elems) ; 

     elems = GetIntegerSize(binr); 
     D = binr.ReadBytes(elems) ; 

     elems = GetIntegerSize(binr); 
     P = binr.ReadBytes(elems) ; 

     elems = GetIntegerSize(binr); 
     Q = binr.ReadBytes(elems) ; 

     elems = GetIntegerSize(binr); 
     DP = binr.ReadBytes(elems) ; 

     elems = GetIntegerSize(binr); 
     DQ = binr.ReadBytes(elems) ; 

     elems = GetIntegerSize(binr); 
     IQ = binr.ReadBytes(elems) ; 

     Console.WriteLine("showing components .."); 
     if (verbose) { 
      showBytes("\nModulus", MODULUS) ; 
      showBytes("\nExponent", E); 
      showBytes("\nD", D); 
      showBytes("\nP", P); 
      showBytes("\nQ", Q); 
      showBytes("\nDP", DP); 
      showBytes("\nDQ", DQ); 
      showBytes("\nIQ", IQ); 
     } 

// ------- create RSACryptoServiceProvider instance and initialize with public key ----- 
     RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 
     RSAParameters RSAparams = new RSAParameters(); 
     RSAparams.Modulus =MODULUS; 
     RSAparams.Exponent = E; 
     RSAparams.D = D; 
     RSAparams.P = P; 
     RSAparams.Q = Q; 
     RSAparams.DP = DP; 
     RSAparams.DQ = DQ; 
     RSAparams.InverseQ = IQ; 
     RSA.ImportParameters(RSAparams); 
     return RSA; 
    } 
    catch (Exception) { 
     return null; 
    } 
    finally { 
     binr.Close(); 
    } 
} 
+0

Macht nichts; das war die Lösung von der anderen Frage. – Stobor

+0

Ich werde es versuchen ... was meinst du, das war die Lösung für die andere Frage? Die angenommene Antwort auf Frage, auf die ich Bezug genommen habe, benutzte die Bouncy Castle Bibliothek (die übrigens auch für mich funktioniert). Ich möchte nur meine Abhängigkeit von Drittanbieter-Bibliotheken minimieren, wo es möglich ist. Selbst diejenigen mit sehr großzügigen Lizenzen. –

+0

@Tim Jarvis: Die Top-Antwort für die andere Frage lautet derzeit "Sie können sich JavaSciences Quelle für OpenSSLKey ansehen." Das ist das gleiche wie das, was ich oben verlinkt und kopiert habe. (BouncyCastle ist, wie der Fragesteller selbst antwortete, nicht die akzeptierte Antwort ...) – Stobor

0

ich habe eine kleine hel erstellt pro NuGet-Paket zum Erstellen eines X509-Zertifikats basierend auf dem öffentlichen Schlüssel und dem privaten Schlüssel (RSA).

Siehe NuGet und Github-project für Funktionalität und Codebeispiele basierend auf opensslkey.