我有一个使用RSACryptoServiceProvider
的旧代码块,我想移植到该代码块以使用较新的RSACng
。我遇到了一个我无法解决的问题:RSACng
的{{1}}方法似乎无法按预期验证哈希。与VerifyHash
一起使用时,相同的代码和数据可以正常工作,并且验证成功。
我已经进行了一些调查,并逐步开发了.NET源,最终一直到RSACryptoServiceProvider
。我确保NCryptVerifySignature
使用的哈希,签名等都相同。最后,由于未知原因,在这种情况下RSACryptoServiceProvider
无法成功验证哈希。
我的代码如下:
NCryptVerifySignature
有人对我做错事情有任何建议吗?这是使用最新的.NET Framework(4.7.2)。
答案 0 :(得分:2)
我对此进行了一点挖掘,问题是因为通过OpenSSL通过以下方式运行时,签名是:
openssl rsautl -verify -in sig.bin -inkey pub.key -pubin -hexdump -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..
基本上,您有一个带有PKCSv1.5填充的签名,并在末尾加上了哈希。但是,签名缺少SEQUENCE(OID(SHA-1), OCTETSTRING)
-摘要将直接进入。
CNG希望按照RSASSA-PKCS1-v1_5中的定义存在OID。您可以 要求CNG通过将NULL传递给BCRYPT_PKCS1_PADDING_INFO
的{{1}}来放宽此要求,但是就我而言,这在.NET Framework或Core中没有公开。知道。
关于如何解决它,如果可能的话,现在最简单的方法是使用CAPI / RsaCryptoServiceProvider。 GitHub问题34202可能会跟踪CNG行为的任何其他进展。