2011-02-09 96 views
3

我有一台服务器,运行在python下,使用m2crypto签署消息sha256摘要我使用由openssl CLI生成的公共和私有RSA密钥。在服务器端everythgin是行
Python代码:用openssl验证数据签名,使用crypto ++

专用密钥= M2Crypto.RSA.load_key(sys.argv中[2])
signedDigest = privateKey.sign(消化, 'SHA256')

我仔细检查签名是正确的:

PUBKEY = M2Crypto.RSA.load_pub_key( “key.pub.pem”)
如果pubKey.verify(消化,signedDigest“ (等....)

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

RSA :: PublicKey pubKey;
pubKey.Load(FileSource(LicenseControl :: pubKeyPath,true));
RSASS < PKCS1v15,SHA> ::验证者验证者(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签署original_file
验证OK

这证实了已签名的sha256摘要是可以的,并且它可以用来使用公钥验证消息是否成功。我知道DER和PEM格式(使用PEM for openssl,DER for cryptopp)。所以我相信公钥是正确的。 现在我的问题是如何使用cryptopp库来验证签名? 我已经通过了文档,但经过几天,它仍然看起来像中国人。我尝试过甲肝类似的事情

RSASS < PSSR,SHA> ::验证验证(PUBKEY);

使用PSSR在Python代码加密,但没有运气... 我现在考虑只与公钥解密签署SHA256消化和我把它比作新SHA256摘要与接收文件计算。但即使如此简单,我在文档中找不到... 任何想法如何正确使用验证器?
如何使用公钥解密?如果前面的问题不能在这里解决

回答

1

两个问题,我认为:

首先,SHA在RSASS< PKCS1v15, SHA >意味着SHA-1,不SHA_256。您需要在此处输入SHA256

此外,VerifyMessage需要整个消息,而不仅仅是一个散列 - 该散列是在内部为您计算的。所以现在,当你试图验证消息时,你实际上(就Crypto ++而言)试图验证SHA-1(SHA-256(msg)),所以很自然地失败了。改为传递整个实际消息,跳过额外的SHA-256计算。