Расшифруйте с сертификатом PrivateKey X.509 - PullRequest
7 голосов
/ 04 ноября 2010

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

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

Я нашел этот класс 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?

Спасибо,

Jose

Ответы [ 2 ]

12 голосов
/ 04 ноября 2010

Сам сертификат содержит только открытый ключ (+ некоторые данные), но не закрытый ключ.(Очень маловероятно, что закрытый ключ RSA - это «мой пароль». Пароль, который защищает ваш личный ключ, может быть и «моим паролем», но сам секретный ключ (точнее, частный показатель в 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 голосов
/ 04 ноября 2010

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

...