Python 想问下怎么用 python 用公钥解密服务端返回的数据啊?

曦枫落 · 2020年08月19日 · 最后由 aries 回复于 2020年09月08日 · 379 次阅读

服务端用私钥 rsa 加密然后 base64 给客户端,怎么将接口返回的字符串解密成明文,用 Crypto.Cipher 库提示 TypeError: This is not a private key,网上找了几天都没有找到合适的答案,有知道的可以给个提示吗?

共收到 15 条回复 时间 点赞

我猜你们服务端的加密在 Java 做的,可以让开发打包一个 jar 包你,直接在 Python 调用

Jerry li 回复

是的,打 jar 包然后 python 调用会不会比较麻烦,现在想最好是可以 python 能实现就 python 实现。不能的话最后下下策就是你说的这种方式了,就差解密接口返回参数了,你知道 python3 是不支持公钥解密这种方式吗?

曦枫落 回复

我觉得 jar 包反倒是上策,减少你的沟通成本,代码可信度更高,也很方便使用。

曦枫落 回复

我以前也遇到过你说的问题,折腾了很久,用 Python 解密还是失败,最后还是用 jar 包的方式解决。
确实像三楼说的一样,用 jar 包减少很多沟通的成本

直接用 jar 包嘛,这样 jmeter 也可以用

好的,我试下在 python 中引用 jar 包,因为以前没有试过调用 jar 包的

Jerry li 回复

花了一周多的时间去看,发现最后是不支持的,支持公钥解密的也是 python2 那个 M2Crypto 库,也特别难装,不一定能实现,所以放弃了,尝试用 jar 包去看下。

xia 回复

又 get 到一种新技能,哈哈哈。加密接口,jmeter 也能调用 jar 包实现加密请求参数后请求接口?

其实是支持的,用两个包,pycryptodome 和 pyOpenSSL,pyOpenSSL 的作用是从私钥文件中获取私钥,pycryptodome 是做加解密和签名。代码是公司内部的,不方便拿出来。只是有一点比较麻烦,就是 pycryptodome 官方不支持 nopadding 模式,如果你公司用的是这种模式的话,你要自己封装一个。另外,没记错,服务器端如果加密了返回报文应该用另一端的私钥解密

曦枫落 回复

直接用 subprocess,协定好传入的参数就行。

def get_auth_key(file_key):
    cmd = 'java -jar {} \'{}\' {} \'{}\''.format(auth_key_jar_path, file_key, date_off, ori_auth_key)
    return shell_utils.getoutput(cmd)

这是我现在写的

以前有写过一个类似的,楼主可以参考一下。
https://github.com/charseki/get_rsa_pwd.git

最好还是用 jar 包,这样能保证一定是正确的,python 不能保证,建议可以把这种加密、解密、加签、验签的东西独立出来,写成一个服务,供别人调用,或者下次加密方式变了或者多一种方式,直接在加解密服务上修改就行了,自动化或者其它平台调用

独缺 回复

服务端返回的报文公钥解密,python 貌似支持不了,估计 jar 包会方便点,现在尝试用这种方式解决

曦枫落 回复

可以,请求验签就是验证参数,jar 包用来处理输出参数的,带着请求一起发就过了

通过 RPC 协议传递的密文在解码之前一般要转二进制,在用对应的库函数解密;对于这种情况,我的一般思路是参考实际的解密流程,比如实际的客户端是按什么步骤解密的,了解这个步骤再迁移到 python 上来即可,RSA 这种加解密 python 肯定有支持的很好的库。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册