服务端用私钥 rsa 加密然后 base64 给客户端,怎么将接口返回的字符串解密成明文,用 Crypto.Cipher 库提示 TypeError: This is not a private key,网上找了几天都没有找到合适的答案,有知道的可以给个提示吗?
我猜你们服务端的加密在 Java 做的,可以让开发打包一个 jar 包你,直接在 Python 调用
是的,打 jar 包然后 python 调用会不会比较麻烦,现在想最好是可以 python 能实现就 python 实现。不能的话最后下下策就是你说的这种方式了,就差解密接口返回参数了,你知道 python3 是不支持公钥解密这种方式吗?
我以前也遇到过你说的问题,折腾了很久,用 Python 解密还是失败,最后还是用 jar 包的方式解决。
确实像三楼说的一样,用 jar 包减少很多沟通的成本
直接用 jar 包嘛,这样 jmeter 也可以用
花了一周多的时间去看,发现最后是不支持的,支持公钥解密的也是 python2 那个 M2Crypto 库,也特别难装,不一定能实现,所以放弃了,尝试用 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)
这是我现在写的
最好还是用 jar 包,这样能保证一定是正确的,python 不能保证,建议可以把这种加密、解密、加签、验签的东西独立出来,写成一个服务,供别人调用,或者下次加密方式变了或者多一种方式,直接在加解密服务上修改就行了,自动化或者其它平台调用
通过 RPC 协议传递的密文在解码之前一般要转二进制,在用对应的库函数解密;对于这种情况,我的一般思路是参考实际的解密流程,比如实际的客户端是按什么步骤解密的,了解这个步骤再迁移到 python 上来即可,RSA 这种加解密 python 肯定有支持的很好的库。