使用PrivateKey X.509证书解密

jom*_*men 7 .net c# certificate private-key

我有一个问题是解密消息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
Run Code Online (Sandbox Code Playgroud)

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文件解密消息吗?

谢谢,

何塞

Bru*_*uno 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
Run Code Online (Sandbox Code Playgroud)

(如果未指定-pfx CA.pfx,则会启动交互式界面,在这种情况下,您需要勾选该框以导出私钥.)

然后,尝试使用该pfx/p12文件进行解密.