2010-11-04 4 views
7

У меня возникла проблема с расшифровкой сообщения usgin X.509 Certificate.Расшифровать с помощью PrivateKey X.509 Certificate

сгенерировать свой сертификат с MakeCert с этой опцией:

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

И PrivateKey был "мойпароль".

Моя проблема в том, когда я хочу расшифровать шифрование сообщения с помощью предыдущего сертификата в C#.

Я нашел этот класс http://blog.shutupandcode.net/?p=660, но в методе X509Decrypt всегда имеет значение PrivateKey.

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

Я попытался пропусканием файл сертификата (CER-

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

И передавая файл ПВК (.pvk)

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

Но есть ВСЕГДА, что PrivateKey свойство равно нулю.

Может ли кто-нибудь вести меня, чтобы расшифровать сообщение, используя файл pvk?

Спасибо,

Хосе

ответ

12

Свидетельство сам содержит только открытый ключ (+ некоторые данные), но не закрытый ключ. (Очень маловероятно, что закрытый ключ RSA является «mypassword». Пароль, который защищает ваш закрытый ключ, может быть «mypassword», но сам закрытый ключ (более конкретно частный экспонент в RSA) будет довольно длинным.)

В результате (потому что CA.cer содержит только сертификат), X509DecryptString(token, @"c:\CA.cer", "mypassword") почти наверняка не сработает.

X509DecryptString(token, @"c:\CA.pvk", "mypassword"); может работать в принципе, но вы создаете объект X509Certificate2, и ему по-прежнему нужен сертификат и закрытый ключ. Вы должны иметь возможность загрузить это из контейнера PKCS # 12 (.p12/.pfx).

Для создания этого контейнера можно использовать pvk2pfx:

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

(Если вы не укажете -pfx CA.pfx, она запустит интерактивный интерфейс, в этом случае вам нужно поставить галочку, чтобы экспортировать закрытый ключ.)

Затем попробуйте расшифровать, используя этот файл pfx/p12.

+0

Я был неправ. «mypassword» не был закрытым ключом. Спасибо за ваш комментарий, это было полезно. С новым файлом pfx я могу расшифровать сообщение. – jomarmen

0

Думаю, вы должны использовать «-sky exchange» для создания пары открытого/закрытого ключей.

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