Дешифрирайте с PrivateKey X.509 сертификат

Имам проблем да дешифрирам съобщение usgin X.509 сертификат.

Генерирам сертификата си с makecert с тези опции:

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

И PrivateKey беше "mypassword".

Проблемът ми е, когато искам да дешифрирам съобщение, шифровано с предишен сертификат в 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 файла (.pvk)

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

Но винаги имайте, че свойството PrivateKey е нула.

Може ли някой да ме напътства да дешифрирам съобщението с помощта на 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
Сгреших. моята парола не беше частен ключ. Благодаря за коментара, беше полезен. С новия pfx файл мога да дешифрирам съобщението. - person jomarmen; 05.11.2010

Мисля, че трябва да използвате "-sky exchange", за да генерирате чифт публичен/частен ключ.

person Les    schedule 04.11.2010