【问题标题】:Help verifying RSA signed text with Python帮助使用 Python 验证 RSA 签名文本
【发布时间】:2011-09-16 06:16:45
【问题描述】:

我使用 Java 创建了 RSA 密钥对。使用 Java,我可以使用这些密钥对一些文本进行签名和验证。我还可以以 PEM 格式“导出”这些密钥并将它们加载到 Python 测试脚本中。进入 Python 脚本后,我可以使用这些密钥通过 M2Crypto 对某些文本进行签名和验证。

我还不能在 Python 中验证我在 Java 中创建的签名。

现在我只是想让跨平台签名和验证工作。

这里是Java sn-p:

Signature sig = Signature.getInstance("MD5WithRSA");
sig.initSign(key.getPrivate());
sig.update("This is a message.".getBytes("UTF8"));
byte[] signatureBytes = sig.sign();     
return Base64.encodeBytes(signatureBytes, Base64.DO_BREAK_LINES);

生成:

PIp4eLhA941xmpdqu7j60731R9oWSNWcHvwoVADKxABGoUE02eDS0qZ4yQD2vYBdRDXXxHV4UjtW
YQwv9nsOzCBWeDQ0vv6W0dLVfTBuk79On7AALuwnTFr8s0y5ZN5RINvPPR60mwONav26ZbPj4ub3
NZqUS/zkqyO8Z8D2zUjk0pqAhWDGbFBaWPQJBPOY9iRt8GlsAUkGfYGeIx9DNU8aiJmQ3NnUHbs4
5NEr3xydbNJjwK96kkNJ9vyKZRfnNd4eW2UllPiwJSRQgefCQfh79ZuiYeQEuk3HMh7Si4iYl7uU
rWCgYFl4fGV1X/k+BSHR4ZZFWGQ3IPfafYHyNw==

这是公钥:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg+N7xQHVHU3VHMZ9VGFdUf6ud3rAL8YS
sfWv2zFMnKAjh6XacwDGX6jJR/0/pyDriRGw/uodBDSFvgn9XEM/srMYtbJ1KQ9R9ChDifixF3Hx
yzbzPRvFoEfZnS/63+d1r0wnafz7xx0eDEYE3TgRKTMikwOsuIOFWa7GhA4BvP7ad79bI5ORJdLu
9Je+k+4dbt0xk2t7YopxYmyU+4zhZMxuthJTr69rXgqhgsCRdK6kFIGm3YuJ1WQcci8OVwH+3o7F
XzJHpSTxH57m6PX5lXaywIDCbUauTpBV3w+0vTeGI/2o+U40qhLBkpZT9GSVKxgXl5a0XxrkwTGn
61XZqQIDAQAB
-----END PUBLIC KEY-----

然后在 Python 中加载密钥并尝试验证签名:

from M2Crypto import RSA, EVP
pub_key = RSA.load_pub_key('public_key.pem')
verify_evp = EVP.PKey()
verify_evp.assign_rsa(pub_key)
verify_evp.verify_init()
verify_evp.verify_update("This is a message.")
if verify_evp.verify_final(sig_string.decode('base64')) == 1:
    print "Good"
else:
    print "Bad"

这并不能验证。我怀疑这是我不理解的一些前导或尾随字符或编码怪异。

我对 M2Crypto 没有特别的依恋,也玩过 gdata.tlslite 模块。

请注意,密钥是有效的,上面的文本和签名在 Java 中验证,密钥(公共和私有)可以在 Python 中用于签署和验证文本。问题在于 Java 生成的签名和/或消息文本如何进入 Python 代码。

我做错了什么?

【问题讨论】:

  • 它正在工作。 “这是一条消息。”在我的真实代码中是 unicode(与发布的简化代码相反),所以添加 .encode('ascii') 让它工作。我需要咖啡。
  • 也许使用.encode('utf_8') 来完全匹配Java。我现在正在喝咖啡。
  • 这是我的第一道攻击线,但由于某种原因它不起作用。我想咖啡不够。

标签: java python rsa public-key m2crypto


【解决方案1】:

M2Crypto.EVP 默认为 'sha1' (SHA1),而您使用的是 MD5WithRSA。我认为你应该切换SHA1WithRSA(MD5 是一个非常弱算法)。

【讨论】:

  • 我在某个地方切换到 SHA1withRSA,纯粹是偶然在 M2Crypto 源和其他地方闲逛之后尝试不同的东西。我不知道这是一个更好的选择。感谢您的提示。
  • 现在可以用了吗?如果是,您应该关闭问题。如果没有,您还有其他详细信息吗?
猜你喜欢
  • 2017-01-17
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
相关资源
最近更新 更多