2010-11-04 24 views
7

Tengo un problema para descifrar un mensaje que usa el certificado X.509.descifrar con PrivateKey X.509 certificado

genero mi certificado con makecert con estas opciones:

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

Y el PrivateKey era "micontraseña".

Mi problema es cuando quiero descifrar un mensaje cifrar con el certificado anterior en C#.

Encontré esta clase http://blog.shutupandcode.net/?p=660, pero en el método X509Decrypt siempre la PrivateKey es nula.

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

Traté de pasar el archivo de certificado (.cer)

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

Y pasando el archivo pvk (.pvk)

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

Pero Allways tienen la propiedad de que PrivateKey es nulo.

¿Alguien puede guiarme para descifrar el mensaje usando el archivo pvk?

Gracias,

José

Respuesta

12

El certificado en sí sólo contiene la clave pública (+ algunos datos), pero no la clave privada. (Es muy poco probable que la clave privada RSA sea "mypassword". La contraseña que protege su clave privada puede ser "mypassword", pero la clave privada en sí misma (más específicamente, el exponente privado, en RSA) será un número bastante largo).

Como resultado (porque CA.cer solo contiene el certificado), X509DecryptString(token, @"c:\CA.cer", "mypassword") casi seguro no funcionará.

X509DecryptString(token, @"c:\CA.pvk", "mypassword"); podría funcionar en principio, pero está creando un objeto X509Certificate2, y aún necesita el certificado y la clave privada. Debería poder cargar eso desde un contenedor PKCS # 12 (.p12/.pfx).

Para crear este contenedor, puede utilizar pvk2pfx:

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

(Si no se especifica -pfx CA.pfx, se pondrá en marcha la interfaz interactiva, en cuyo caso es necesario marcar la casilla para exportar el privado tecla.)

A continuación, intente descifrar usando ese archivo pfx/p12 en su lugar.

+0

Estaba equivocado. "mypassword" no era una clave privada. Gracias por su comentario, ha sido útil. Con el nuevo archivo pfx puedo descifrar el mensaje. – jomarmen

0

Creo que deberías estar utilizando "-sky exchange" para generar un par de claves pública/privada.

Cuestiones relacionadas