C# 使用X509Certificate2对ECDSA-SHA256签名进行签名和验证

C# 使用X509Certificate2对ECDSA-SHA256签名进行签名和验证,c#,ssl,sha256,x509certificate2,ecdsa,C#,Ssl,Sha256,X509certificate2,Ecdsa,我使用OpenSSL使用SHA256创建ECC证书。现在,我想使用这些证书对数据进行签名并验证现有签名 我尝试使用DSACryptoServiceProvider,但它只支持SHA1或MD5 但似乎ECDsaCng能够支持ECDSA-with-SHA256。我唯一的问题是,我不知道如何将私钥和公钥从我的X509Certificate2转换为必要的CngKey。我读到另一个问题,其中有人描述了如何转换公钥。但是为了能够对数据进行签名,我也需要私钥 那么有没有办法从X509Certificate2中

我使用
OpenSSL
使用
SHA256
创建ECC证书。现在,我想使用这些证书对数据进行签名并验证现有签名

我尝试使用
DSACryptoServiceProvider
,但它只支持
SHA1
MD5

但似乎
ECDsaCng
能够支持
ECDSA-with-SHA256
。我唯一的问题是,我不知道如何将私钥和公钥从我的
X509Certificate2
转换为必要的
CngKey
。我读到另一个问题,其中有人描述了如何转换公钥。但是为了能够对数据进行签名,我也需要私钥

那么有没有办法从
X509Certificate2
中获取私钥和公钥的
CngKey
证书有不同的格式。我把它们作为PFX文件,分别作为CER和PEM文件


我更愿意坚持使用
.netframework4
,但如果根本不可能使用它,我也会切换到
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);
    }
}

谢谢你的提示。不幸的是,v4.6.1太高了,我只能使用v4.0。