使用X509Certificate2对ECDSA-SHA256签名进行签名和验证
本文关键字:验证 X509Certificate2 ECDSA-SHA256 使用 | 更新日期: 2023-09-27 18:22:23
我使用OpenSSL
使用SHA256
创建ECC证书。现在我想使用这些证书对数据进行签名并验证现有签名。
我尝试使用DSACryptoServiceProvider
,但它只支持SHA1
或MD5
。
但似乎ECDsaCng
能够支持ECDSA-with-SHA256
。我唯一的问题是,我不知道如何将私钥和公钥从X509Certificate2
转换为必要的CngKey
。我读到另一个问题,其中有人描述了如何转换公钥。但为了能够签署数据,我也需要私钥。
那么有没有办法从X509Certificate2
中获得私钥和公钥的CngKey
证书有不同的格式。我把它们作为PFX文件,分别作为CER和PEM文件。
我更喜欢使用.NET Framework 4
,但如果根本无法使用它,我也会切换到Bouncy Castle
。
在.NET 4.6.1:中添加了对此的支持
private static byte[] SignWithCert(X509Certificate2 cert, byte[] data)
{
using (ECDsa ecdsa = cert.GetECDsaPrivateKey())
{
if (ecdsa == null)
throw new ArgumentException("Cert must have an ECDSA private key", nameof(cert));
return ecdsa.SignData(data, HashAlgorithmName.SHA256);
}
}
private static bool VerifyWithCert(X509Certificate2 cert, byte[] data, byte[] signature)
{
using (ECDsa ecdsa = cert.GetECDsaPublicKey())
{
if (ecdsa == null)
throw new ArgumentException("Cert must be an ECDSA cert", nameof(cert));
return ecdsa.VerifyData(data, signature, HashAlgorithmName.SHA256);
}
}