帮助使用Python验证RSA签名文本

1 投票
1 回答
1543 浏览
提问于 2025-04-16 19:41

我用Java创建了RSA密钥对。通过Java,我可以用这些密钥来对一些文本进行签名和验证。我还可以把这些密钥“导出”成PEM格式,然后在一个Python测试脚本中加载它们。一旦在Python脚本中,我就可以用这些密钥通过M2Crypto来签名和验证一些文本。

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

现在我只是想让跨平台的签名和验证能够正常工作。

这是Java代码片段:

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代码中的。

我哪里做错了?

1 个回答

2

M2Crypto.EVP 默认使用的是 'sha1'(SHA1),而你现在用的是 MD5WithRSA。我觉得你应该换成 SHA1WithRSA(因为 MD5 是一种非常不安全的算法)。

撰写回答