Расшифровать с помощью сертификата PrivateKey X.509

У меня проблема с расшифровкой сообщения usgin 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 был «моим паролем».

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

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

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 (.pvk)

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

Но всегда свойство PrivateKey имеет значение null.

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

Спасибо,

Хосе


person jomarmen    schedule 04.11.2010    source источник


Ответы (2)


Сам сертификат содержит только открытый ключ (+ некоторые данные), но не закрытый ключ. (Очень маловероятно, что закрытым ключом 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.

person Bruno    schedule 04.11.2010
comment
Я был неправ. mypassword не был закрытым ключом. Спасибо за ваш комментарий, он оказался полезным. С новым файлом pfx я могу расшифровать сообщение. - person jomarmen; 05.11.2010

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

person Les    schedule 04.11.2010