首页 > 解决方案 > SignedData 给出了无效的算法指定。异常

问题描述

我尝试使用 myCert.pfx 文件私钥和公钥对我的签名数据进行签名和验证。但是在签署数据时,我得到“指定的算法无效”。例外

我们使用的.Net框架是4.5,代码如下

public static void CallMainMethod()
{
    string str = "Sign and verify the data";
    X509Certificate2 certificate = LoadPrivateKey();

    byte[] hashBytes = GetDataHash(str);
    byte[] signature = GetDigitalSignature(hashBytes);
} 

 private static X509Certificate2 LoadPrivateKey()
{
    return new X509Certificate2(@"d:\Keys\myCert.pfx", "Pass#@123");
}

 private static byte[]  GetDataHash(string sampleData)
{
    //choose any hash algorithm
    SHA256Managed managedHash = new SHA256Managed();
    return managedHash.ComputeHash(Encoding.Unicode.GetBytes(sampleData));
}

private static byte[] GetDigitalSignature(byte[] data)
{
    X509Certificate2 certificate = LoadPrivateKey();
    RSACryptoServiceProvider provider = (RSACryptoServiceProvider)certificate.PrivateKey;   
    return provider.SignHash(data, "SHA256");
}

标签: c#x509certificatesha256x509certificate2pfx

解决方案


我相信遗留RSACryptoServiceProvider不支持 SHA2 算法。重写最后一个方法如下:

private static byte[] GetDigitalSignature(byte[] data)
{
    X509Certificate2 certificate = LoadPrivateKey();
    RSA provider = certificate.GetRSAPrivateKey();   
    return provider.SignHash(data, "SHA256", RSASignaturePadding.Pkcs1);
}

从 .NET Framework 4.6 及更高版本开始,这种风格是首选(@bartonjs,如果我对 .NET 版本有误,请纠正我)。


推荐阅读