为什么是SignHash从RSACng (dotNetCore)不同于BoncyCastle(运行在Mono)?<



我正在尝试总结:我有一个自签名证书(由OpenSSL创建)在aspnetCore API中用于验证哈希(或消息摘要,如果您喜欢)签名。我可以运行测试来签名哈希并在API中运行,一切都很顺利。

现在,我正在尝试让我的客户端签署这样的哈希并使用API。它是一个运行在Mono上的应用程序。我尝试做与我的测试完全相同的事情,但是Mono在X509Certificate2中有一个错误,当pfx证书受密码保护时。所以,我把它换成了著名的蹦蹦跳跳城堡。然而,结果却不同……检查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);

两个证书是相同的。调试时,我可以看到dotNet实例化在提供程序上为RSACngSignatureAlgorithm属性为RSA";作为KeyExchangeAlgorithm所以。

BoncyCastleMono提供程序RSACrytoServiceProvider。根据我读过的一些文章,这应该不会有什么不同。然而,SignatureAlgorithm"http://www.w3.org/2000/09/xmldsig rsa-sha1",而KeyExchangeAlgorithm">RSA-PKCS1-KeyEx"。

Thanks in advance

我的错:我刚刚意识到我的程序没有使用它应该用来计算哈希值的字符串…

使用BouncyCastle的Mono版本工作得很好。

最新更新