2010-11-04 23 views
7

Ho un problema per decodificare un messaggio usgin X.509 Certificate.Decifrare con PrivateKey Certificato X.509

ho generare il mio certificato con makecert con queste opzioni:

makecert -r -pe -n "CN=MyCertificate" -ss CA -sr CurrentUser -a sha1 -sky signature -cy authority -sv CA.pvk CA.cer 

E il PrivateKey ero "mypassword".

Il mio problema si verifica quando si desidera decodificare un messaggio crittografato con certificato precedente in C#.

Ho trovato questa classe http://blog.shutupandcode.net/?p=660, ma nel metodo diX509Decrypt allways la PrivateKey è nullo.

 
public static byte[] X509Decrypt(byte[] data, string certificateFile, string password) 
{ 
    // load the certificate and decrypt the specified data 
    using (var ss = new System.Security.SecureString()) 
    { 
     foreach (var keyChar in password.ToCharArray()) 
      ss.AppendChar(keyChar); 

     // load the password protected certificate file 
     X509Certificate2 cert = new X509Certificate2(certificateFile, ss); 

     using (RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey) 
     { 
      return rsa.Decrypt(data, true); 
     }  
    } 
} 

ho provato passando il file del certificato (cer)

 
X509DecryptString(token, @"c:\CA.cer", "mypassword"); 

E passando il file PVK (.pvk)

 
X509DecryptString(token, @"c:\CA.pvk", "mypassword"); 

Ma hanno allways che la proprietà PrivateKey è nullo.

Qualcuno può guidarmi a decodificare il messaggio utilizzando il file pvk?

Grazie,

Jose

risposta

12

il certificato stesso contiene solo la chiave pubblica (+ alcuni dati), ma non la chiave privata. (È molto improbabile che la chiave privata RSA sia "mypassword". La password che protegge la tua chiave privata potrebbe essere "mypassword", ma la chiave privata stessa (in particolare l'esponente privato, in RSA) sarà un numero piuttosto lungo.)

Di conseguenza (poiché CA.cer contiene solo il certificato), X509DecryptString(token, @"c:\CA.cer", "mypassword") quasi certamente non funzionerà.

X509DecryptString(token, @"c:\CA.pvk", "mypassword"); potrebbe funzionare in linea di principio, ma si sta creando un oggetto X509Certificate2 da esso e ha ancora bisogno del certificato e della chiave privata. Dovresti essere in grado di caricarlo da un contenitore PKCS # 12 (.p12/.pfx).

Per creare questo contenitore, è possibile utilizzare pvk2pfx:

pvk2pfx -spc CA.cer -pvk CA.pvk -pfx CA.pfx 

(Se non si specifica -pfx CA.pfx, che lancerà l'interfaccia interattiva, nel qual caso è necessario spuntare la casella per esportare il privato chiave.)

Quindi, provare a decodificare utilizzando invece il file pfx/p12.

+0

Ho sbagliato. "Mypassword" non era una chiave privata. Grazie per il tuo commento è stato utile. Con il nuovo file pfx posso decifrare il messaggio. – jomarmen

0

Penso che dovresti usare "-sky exchange" per generare una coppia di chiavi pubblica/privata.

Problemi correlati