c# - 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");
}
解决方案
我相信遗留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 版本有误,请纠正我)。
推荐阅读
- swift - 如何在 RealityKit 中为模型的旋转设置动画?
- bash - bash 变量吃掉多个空格,把它们变成一个
- asp.net-core - gRPC 和 ASP.NET Core:服务器端反射
- python - 在抽象类的情况下,实例化的最佳方式是什么?
- r - 规模无法识别函数中的参数与R
- java - IntelliJ + Gradle + JavaFX 构建,但未运行
- javascript - Is it possible to add the latest version of bootstrap to widgets that use jquery version 2.1.3?
- python - JSON decoding error when querying Wikidata
- vba - 如何通过 dlookup 功能启用和禁用表单上的按钮?
- c++ - control font and character set in console using visual studio c++