c# – 使用X509Certificate2签名并验证ECDSA-SHA256签名

我使用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);
    }
}
上一篇:C#HMAC SHA-256-128计算结果与预期不符


下一篇:关于settimeout 和for循环