Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RSACng无法验证哈希_C#_.net_Cryptography - Fatal编程技术网

C# RSACng无法验证哈希

C# RSACng无法验证哈希,c#,.net,cryptography,C#,.net,Cryptography,我有一个使用rsaccryptoserviceprovider的旧代码块,我想将其移植到新的RSACng。我遇到了一个无法解决的问题:RSACng的VerifyHash方法似乎无法按预期验证哈希。与rsacyptoserviceprovider一起使用时,相同的代码和数据工作正常,验证成功 我做了一些调查和.NET源代码步进,最终一直到NCryptVerifySignature。我确保哈希、签名等与rsacyptoserviceprovider的工作方式相同。最后,由于未知原因,NCryptVe

我有一个使用
rsaccryptoserviceprovider
的旧代码块,我想将其移植到新的
RSACng
。我遇到了一个无法解决的问题:
RSACng
VerifyHash
方法似乎无法按预期验证哈希。与
rsacyptoserviceprovider
一起使用时,相同的代码和数据工作正常,验证成功

我做了一些调查和.NET源代码步进,最终一直到
NCryptVerifySignature
。我确保哈希、签名等与
rsacyptoserviceprovider
的工作方式相同。最后,由于未知原因,
NCryptVerifySignature
无法成功验证本例中的哈希

我的代码如下:

var rsaKeyPub = "BgIAAACkAABSU0ExAAgAAAMAAAC7N02Zb0lf3UO4pl3ymFvkrNSkPP0Q076vYzvbeTqS5vkBcoXloM044q1LCFtaXw6DUzSFM0IqoGOONb+PW+UeNcTcA/+MKNi7nzbBGg3kAj8QhuxO3u2QJXg62Zb9H+SEvZYfi9PhOCSo0LpWKl72k+uaoTyPAuV738TamRvXWb8XOswSmsHQa38q1Id4TW7CzvVOjc0vnhL+rZ8Po1qg5FJc8m8gdGWC0a4NJTzBsOqLzeVE12B8zgIMehu1gGw/SjY5PVEkDABWgY2DzxLT3rbs6oZ5ZLSHu041q3s1ihOQ8+GMRx3qqvPyB4JVlyd7jqN0j0dT+Yqr+8t3/Liu";
var hash = "Ow1kg47GAgf9cyZbisDuTRNy5NQ=";
var signature = "bBnFouYvuZSYZIPihDB4J/CVC7o5ej3MrbkZV9cn6vgL23rDW1jevWEHx4wGBXLc443DKrZ0XQlSpp3FE/+isyDMcGh7c0buMufiYuOQ0rbo8e4tvuZuZpt+06xnBQcYyFMqe4lkFcI0f/NeAIvy1vME+Kq4v3ikwR4+CsjObgEJIBdWB0B4cqp8355pxtYJv2BQ7UHy/Tv0+OtslgbxikrwU2CQ+tR3XHywIdzm0BEOBfdnOlky96ED18BAqwLlxjef0snCl3DvKz93gtIIQVwEoDRlKC/v/Xb4Eke/fyvt66orLEIyL8Emaer9J6P38ZB1pWRuOsLCv4ly8fnOMw==";
RSAParameters rsaParams;
using (var rsa = new RSACryptoServiceProvider())
{
    rsa.ImportCspBlob(Convert.FromBase64String(rsaKeyPub));
    //Export now for easy importing in the next function. This is not the reason the next block returns false.
    rsaParams = rsa.ExportParameters(false);
    Console.WriteLine(rsa.VerifyHash(Convert.FromBase64String(hash), Convert.FromBase64String(signature), HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1));
}
using (var rsa = new RSACng())
{
    rsa.ImportParameters(rsaParams);
    Console.WriteLine(rsa.VerifyHash(Convert.FromBase64String(hash), Convert.FromBase64String(signature), HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1));
}

有人对我做错了什么有什么建议吗?这是使用最新的.NET Framework(4.7.2)。

我对此进行了深入研究,问题是,当通过以下方式运行OpenSSL时,签名:

openssl rsautl-verify-in sig.bin-inkey pub.key-pubin-hextump-raw
显示:

0000 - 00 01 ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0010 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0020 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0030 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0040 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0050 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0060 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0070 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0080 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 0090 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 00a0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 00b0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 00c0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 00d0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 00e0 - ff ff ff ff ff ff ff ff-ff ff ff 00 3b 0d 64 83 ............;.d. 00f0 - 8e c6 02 07 fd 73 26 5b-8a c0 ee 4d 13 72 e4 d4 .....s&[...M.r.. 0000-00 01 ff ff ff ff ff ff ff ff ff ff ff ff ff。。。。。。。。。。。。。。。。 0010-ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff。。。。。。。。。。。。。。。。 0020-ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff。。。。。。。。。。。。。。。。 0030-ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff。。。。。。。。。。。。。。。。 0040-ff ff ff ff ff ff ff ff ff ff ff ff ff ff。。。。。。。。。。。。。。。。 0050-ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff。。。。。。。。。。。。。。。。 0060-ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff。。。。。。。。。。。。。。。。 0070-ff ff ff ff ff ff ff ff ff ff ff ff ff ff。。。。。。。。。。。。。。。。 0080-ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff。。。。。。。。。。。。。。。。 0090-ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff。。。。。。。。。。。。。。。。 00a0-ff ff ff ff ff ff ff ff ff ff ff ff ff ff。。。。。。。。。。。。。。。。 00b0-ff ff ff ff ff ff ff ff ff ff ff ff ff ff。。。。。。。。。。。。。。。。 00c0-ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff。。。。。。。。。。。。。。。。 00d0-ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff。。。。。。。。。。。。。。。。 00e0-ff ff ff ff ff 00 3b 0d 64 83。。。。。。。。。。。。;。D 00f0-8e c6 02 07 fd 73 26 5b-8a c0 ee 4d 13 72 e4 d4…s和[…M.r。。 基本上,您有一个签名,其中PKCSv1.5结尾填充了散列。但是,签名缺少
序列(OID(SHA-1),OCTETSTRING)
-摘要直接进入

CNG希望OID如RSASSA-PKCS1-v1_5中所定义的那样存在。您可以要求CNG通过将NULL传递给
BCRYPT_PKCS1_PADDING_INFO
pszAlgId
,来放宽此要求,但据我所知,这在.NET Framework或Core中没有公开


至于如何修复,目前最简单的方法是使用CAPI/RSACryptServiceProvider。GitHub问题可能会跟踪CNG行为的任何其他进展。

请将代码包括在问题中好吗?您仍然可以链接到gystlyn thingy-这当然很有帮助-但关于这方面的问题应该是独立的,没有代码,你的问题就没有意义了。嗨@MaartenBodewes,代码补充。请告诉我你对问题的原因有什么建议。谢谢!我只能通过测试来尝试,今天我已经没有时间了。事实上,我甚至都没有输入这个:)投票通过了,但令人烦恼的问题是:|我会检查错误报告,并让su您正在开发最新版本。可能包括有问题的框架版本。@MaartenBodewes已更新为包含框架版本。它都是最新的。可能我将在.NET Core上测试它,看看它是否失败,并提交错误报告。不过,我想确保我没有首先在某个地方犯愚蠢的错误。我已经复制了该问题e在C#中使用4.6.1(目前我的计算机上没有更新的平台)。我打赌它是最小的公共指数,检查其他框架/运行时的密钥是否正确…找不到任何关于接受指数3的信息,并且考虑到Microsoft文档的状态,我不确定我是否会找到它。我猜更新旧代码并不总是一件好事。那么有什么实际的解决方案吗@NickG您可以确保签名过程使用包含正确数据结构的PKCS1签名,或者使用
rsacyptoserviceprovider
。NET人员表示他们不打算为RSACng或不透明RSA类型修复此问题。