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

曦枫落 · August 19, 2020 · Last by aries replied at September 08, 2020 · 7974 hits

服务端用私钥 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 包去看下。

对 RhettXia 回复

又 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)

这是我现在写的

11Floor has deleted

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

对 独缺 回复

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

对 曦枫落 回复

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

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

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up。