如何使用.pfx证书加密,解密和签名?

Alu*_*ium 3 c# encryption pfx x509certificate2 x509certificate

我的计算机上有一个.pfx证书文件.我想用其公钥加密消息,然后使用私钥解密.

此外,我想用其私钥签署另一条消息,然后检查签名.我需要从该消息中获取有关该消息已签名的sertificate的信息.

我怎么能用System.Security.Cryptography来做呢?

Tim*_*nem 11

您可以在.NET中打开PFX,如下所示:

var path = <YOUR PFX FILE PATH>;
var password = <YOUR PASSWORD>;

var collection = new X509Certificate2Collection();

collection.Import(path, password, X509KeyStorageFlags.PersistKeySet);
Run Code Online (Sandbox Code Playgroud)

然后,列举一下X509Certificate2Collection.获得证书后(假设有一个证书),则:

var certificate = collection[0];
Run Code Online (Sandbox Code Playgroud)

要加密数据,您可以使用:

var publicKey = certificate.PublicKey.Key as RSACryptoServiceProvider;

var encryptedData = publicKey.Encrypt(<yourdata>, false);
Run Code Online (Sandbox Code Playgroud)

在这里,我没有使用OAEP加密,但你可以通过设置第二个参数的fOAEPto 来使用它true.

要解密数据,您可以使用:

var privateKey = certificate.PrivateKey as RSACryptoServiceProvider;

var data = privateKey.Decrypt(encryptedData, false);
Run Code Online (Sandbox Code Playgroud)

PFX中的证书可能没有相应的私钥,因此您可以在访问该PrivateKey属性之前使用以下属性检查私钥是否存在

if (!certificate.HasPrivateKey)
    throw new Exception("The certificate does not have a private key");
Run Code Online (Sandbox Code Playgroud)

如果您已加密OAEP,则必须使用fOAEPset to 解密true.

要签署数据,您可以使用:

var signature = privateKey.SignData(<yourdata>, "SHA1");
Run Code Online (Sandbox Code Playgroud)

要验证签名,您可以使用:

var isValid = publicKey.VerifyData(<yourdata>, "SHA1", signature);
Run Code Online (Sandbox Code Playgroud)

在这里,我使用SHA1的不被认为是强大的.您可以使用SHA256更强大的其他散列算法.

最后,如果你的消息是一个小字符串,那么前一个程序就可以了.但是,如果您正在加密大数据,那么我建议您使用对称加密,然后使用公钥加密对称密钥.(有关完整示例,请参阅X509Certificate2类.)