使用crypto ++验证使用openssl生成的数据签名

时间:2011-02-09 15:11:49

标签: openssl m2crypto verify crypto++

我有一台服务器,在python下运行,使用m2crypto签署消息sha256摘要 我使用openssl CLI生成的公共和私有RSA密钥。在服务器端,everythgin都可以 Python代码:

  

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

我仔细检查签名是否合适:

  

pubKey = M2Crypto.RSA.load_pub_key(“key.pub.pem”)
  如果pubKey.verify(摘要,signedDigest,'sha256')(等....)

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

  

RSA :: PublicKey pubKey;
  pubKey.Load(FileSource(LicenseControl :: pubKeyPath,true));
  RSASS< 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
  验证确定

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

这样的东西
  

RSASS< PSSR,SHA> :: Verifier验证程序(pubKey);

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

1 个答案:

答案 0 :(得分:1)

我认为这里有两个问题:

首先,RSASS< PKCS1v15, SHA >中的SHA表示SHA-1,而不是SHA_256。你想在这里SHA256

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