使用Crypto++验证使用OpenSSL生成的数据签名

4
我有一个服务器,在Python下运行,使用m2crypto签署sha256摘要的消息。我使用由openssl CLI生成的公钥和私钥。在服务器端一切正常。
Python 代码:

privateKey = M2Crypto.RSA.load_key(sys.argv[2])
signedDigest = privateKey.sign(digest, 'sha256')

我确认签名正确:

pubKey = M2Crypto.RSA.load_pub_key("key.pub.pem")
if pubKey.verify(digest, signedDigest, 'sha256') (等等....)

我将已签名sha256摘要存储在文件中,并与原始消息一起发送到客户端。在客户端上,运行在C++ VC6上,我加载已签名sha256摘要(作为二进制文件),以及签署的消息。现在的目标是验证消息和已签名的sha256。我有cryptopp作为静态链接,我知道它可以正常工作,因为我可以计算sha256,然后与python中的sha256进行比较,结果相同。以下是代码:

RSA::PublicKey pubKey;
pubKey.Load( FileSource(LicenseControl::pubKeyPath, true));
RSASS< PKCS1v15, SHA >::Verifier verifier(pubKey);
//shaDigest是新计算的sha256,signatureByte是从服务器收到的消息的签名
result = verifier.VerifyMessage( shaDigest, CryptoPP::SHA256::DIGESTSIZE, signatureByte, 512);

这可以编译并运行,但始终返回false。为确保签名有效,我已经直接使用openssl CLI进行了验证(而不是通过m2crypto Python包装器):

openssl dgst -sha256 -verify key.pub.pem -signature sign original_file
Verified OK

这证实了签署的sha256摘要是正确的,并且可以使用公钥成功地验证消息。我知道DER和PEM格式(用于openssl的PEM,用于cryptopp的DER)。因此,我相信公钥是正确的。 现在我的问题是如何使用cryptopp库来验证签名?我查看了文档,但经过几天的研究,它仍然对我来说像中文一样难懂。我尝试了以下代码:

RSASS< PSSR, SHA >::Verifier verifier(pubKey);

在Python代码中使用PSSR加密,但没有成功... 现在我考虑仅使用公钥解密已签名sha256摘要,并自己将其与从收到文件计算的新sha256摘要进行比较。但即使是这么简单,我也在文档中找不到答案... 有没有想法如何正确使用verifier? 如何使用公钥进行解密?如果无法解决前一个问题

1个回答

1

我认为这里有两个问题:

首先,在 RSASS< PKCS1v15, SHA > 中,SHA 表示的是 SHA-1 而不是 SHA_256。你应该使用 SHA256

另外,VerifyMessage 需要整个消息而不仅仅是哈希值——哈希值会在内部计算。所以现在当你尝试验证消息时,实际上(就 Crypto++ 而言)你正在尝试验证 SHA-1(SHA-256(msg)),因此自然会失败。传递整个实际消息,跳过额外的 SHA-256 计算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接