4

我有一个服务器,在 python 下运行,使用 m2crypto 签署消息 sha256 摘要我使用由 openssl CLI 生成的公共和私有 RSA 密钥。在服务器端,一切都可以
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.Load(FileSource(LicenseControl::pubKeyPath, true));
RASS< PKCS1v15, SHA >::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
验证OK

这确认签名的 sha256 摘要是可以的,并且它可以用于使用公钥成功验证消息。我知道 DER 和 PEM 格式(将 PEM 用于 openssl,DER 用于 cryptopp)。所以我相信公钥是正确的。现在我的问题是如何使用cryptopp库来验证签名???我已经通过了文档,但是经过几天的处理,它对我来说仍然看起来像中文。我试过像

RASS< PSSR, SHA >::Verifier 验证者(pubKey);

使用 PSSR 在 python 代码中加密,但没有运气......我现在考虑只用公钥解密签名的 sha256 摘要并将其与从接收文件计算的新 sha256 摘要进行比较。但即使这么简单,我也没有在文档中找到......知道如何正确使用验证器吗?
如何使用公钥解密?以防上一个问题无法解决

4

1 回答 1

1

我认为这里有两个问题:

首先,SHA inRSASS< PKCS1v15, SHA >表示 SHA-1,而不是 SHA_256。你会想要SHA256这里。

此外,VerifyMessage获取整个消息,而不仅仅是哈希 - 哈希是在内部为您计算的。所以现在当你试图验证消息时,你实际上(就 Crypto++ 而言)试图验证 SHA-1(SHA-256(msg)),所以它自然会失败。而是传递整个实际消息,跳过额外的 SHA-256 计算。

于 2011-06-30T19:39:52.007 回答