2009-07-22 11 views
7

So che questa è una domanda simile a this one ma prima di dirigermi verso il percorso di Bouncey Castle, qualcuno sa se è possibile caricare un KeyPair RSA da un file .pem, ad esempio:Decrittografia con chiave privata da file .pem in C# con libreria crittografica .NET

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

direttamente con la libreria crittografica .NET 3.5, senza dover andare in un 3rd party o rotolare il mio?

+0

@CraigMcQueen buona domanda ... per errore, penserei. –

risposta

11

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

con fonte al http://www.jensign.com/opensslkey/opensslkey.cs

edit: Tratto codice rilevante:

prima, estrarre il testo tra la fine ---- ---- BEGIN e ---- - --- sezioni e base64 decodifica in un array di byte (vedi link sopra per i dettagli), poi passarlo a:

//------- 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

Non importa; questa era la soluzione dall'altra domanda. – Stobor

+0

Darò questo risultato ... cosa volevi dire che era la soluzione per l'altra domanda? La risposta accettata alla domanda cui ho fatto riferimento ha usato la biblioteca di Bouncy Castle (che funziona anche per me, a proposito). Sto solo volendo ridurre al minimo la mia dipendenza dalle librerie di terze parti, ove possibile. Anche quelli con licenze molto generose. –

+0

@Tim Jarvis: la prima risposta per l'altra domanda attualmente è "Potresti dare un'occhiata al sorgente di JavaScience per OpenSSLKey." È lo stesso di quello che ho collegato e copiato sopra. (BouncyCastle è come l'intervistatore ha risposto a se stesso, non la risposta accettata ...) – Stobor

0

ho creato un piccolo hel per pacchetto NuGet per creare un certificato X509 basato su chiave pubblica e chiave privata (rsa).

Vedere NuGet e Github-project per funzionalità ed esempi di codice basati su opensslkey.

Problemi correlati