为什么来自 RSACng (dotNetCore) 的 SignHash 不同于 BoncyCastle(运行 in Mono)?
Why is SignHash from RSACng (dotNetCore) different from BoncyCastle (running in Mono)?
我正在尝试总结:我有一个自签名证书(由 OpenSSL 创建)在 aspnetCore API 中用于验证哈希(或消息摘要,如果您愿意)签名。我可以 运行 测试在 API 中对散列和 运行 进行签名,一切顺利。
现在,我正在尝试让我的客户签署此类哈希并使用 API。这是一个应用程序 运行ning on Mono。我试过做与我的测试完全相同的事情,但是当 pfx 证书受密码保护时,Mono 在 X509Certificate2 中有一个错误。所以,我用著名的 BouncyCastle 代替了它。然而,结果是不同的...检查 pk 算法,我可以看到一些差异,但没有什么特别的(至少对我来说)。
你能给我一些建议吗?我要输入代码:
好的代码 运行正在测试 (dotNet Core):
Console.WriteLine("Entry text:");
var text = Console.ReadLine();
X509Certificate2 certificate = new X509Certificate2((byte[])Resource1._2dbb1721_281d_4990_836c_7e46909b8767, "1509a96c-d56b-4e17-af5b-c11f5f214c74");
SHA1Managed sha1Hasher = new SHA1Managed();
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] data = encoding.GetBytes(text);
byte[] hash = sha1Hasher.ComputeHash(data);
RSA provider = (RSA)certificate.PrivateKey;
var signatureData = provider.SignHash(hash, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
var signature = Convert.ToBase64String(signatureData);
错误代码,运行在 Mono 和 BouncyCastle 上:
SHA1Managed sha1Hasher = new SHA1Managed();
var encoding = new UnicodeEncoding();
byte[] data = encoding.GetBytes(uuid);
byte[] hash = sha1Hasher.ComputeHash(data);
var rsaParameters = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)privateKeyParam);
var provider = RSA.Create();
provider.ImportParameters(rsaParameters);
var signatureData = provider.SignHash(hash, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
var signature = Convert.ToBase64String(signatureData);
两个证书是一样的。调试时,我可以看到 provider 上的 dotNet 实例化为 RSACng。 SignatureAlgorithm 属性 是“RSA”作为 KeyExchangeAlgorithm 所以。
在 BoncyCastle over Mono 中,provider 是 RSACrytoServiceProvider 。根据我阅读的一些文章,这应该没有任何区别。但是,SignatureAlgorithm 是 "http://www.w3.org/2000/09/xmldsig#rsa-sha1",而 KeyExchangeAlgorithm 是“RSA-PKCS1-KeyEx”。
提前致谢
我的错误:我刚刚意识到我的程序没有使用它应该用来计算哈希值的字符串...
使用 BouncyCastle 的 Mono 版本运行良好。
我正在尝试总结:我有一个自签名证书(由 OpenSSL 创建)在 aspnetCore API 中用于验证哈希(或消息摘要,如果您愿意)签名。我可以 运行 测试在 API 中对散列和 运行 进行签名,一切顺利。
现在,我正在尝试让我的客户签署此类哈希并使用 API。这是一个应用程序 运行ning on Mono。我试过做与我的测试完全相同的事情,但是当 pfx 证书受密码保护时,Mono 在 X509Certificate2 中有一个错误。所以,我用著名的 BouncyCastle 代替了它。然而,结果是不同的...检查 pk 算法,我可以看到一些差异,但没有什么特别的(至少对我来说)。
你能给我一些建议吗?我要输入代码:
好的代码 运行正在测试 (dotNet Core):
Console.WriteLine("Entry text:");
var text = Console.ReadLine();
X509Certificate2 certificate = new X509Certificate2((byte[])Resource1._2dbb1721_281d_4990_836c_7e46909b8767, "1509a96c-d56b-4e17-af5b-c11f5f214c74");
SHA1Managed sha1Hasher = new SHA1Managed();
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] data = encoding.GetBytes(text);
byte[] hash = sha1Hasher.ComputeHash(data);
RSA provider = (RSA)certificate.PrivateKey;
var signatureData = provider.SignHash(hash, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
var signature = Convert.ToBase64String(signatureData);
错误代码,运行在 Mono 和 BouncyCastle 上:
SHA1Managed sha1Hasher = new SHA1Managed();
var encoding = new UnicodeEncoding();
byte[] data = encoding.GetBytes(uuid);
byte[] hash = sha1Hasher.ComputeHash(data);
var rsaParameters = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)privateKeyParam);
var provider = RSA.Create();
provider.ImportParameters(rsaParameters);
var signatureData = provider.SignHash(hash, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
var signature = Convert.ToBase64String(signatureData);
两个证书是一样的。调试时,我可以看到 provider 上的 dotNet 实例化为 RSACng。 SignatureAlgorithm 属性 是“RSA”作为 KeyExchangeAlgorithm 所以。
在 BoncyCastle over Mono 中,provider 是 RSACrytoServiceProvider 。根据我阅读的一些文章,这应该没有任何区别。但是,SignatureAlgorithm 是 "http://www.w3.org/2000/09/xmldsig#rsa-sha1",而 KeyExchangeAlgorithm 是“RSA-PKCS1-KeyEx”。
提前致谢
我的错误:我刚刚意识到我的程序没有使用它应该用来计算哈希值的字符串...
使用 BouncyCastle 的 Mono 版本运行良好。