
实现Java加密,Python解密的非对称RSA功能
实现Java加密,Python解密的非对称RSA功能
摘要
因为最近业务需要使用到openssl的rsa非对称加密算法,研究了下它的使用方式,但是特殊在于前端分IOS和android两端,所以前端部门要求使用java给他们做一个加密工具包,但是因为服务端是python做的,所以需要两端的数据能够共通。研究了几天终于搞定了,下面是一些重要的代码以及一些我踩过的坑,分享一下。
欢迎访问我的Github
相关详细Java端代码请查看 FileEncryptDecrypt
相关详细Python端代码请查看 FileDecryptEncrypt
OpenSSL官网
一. 编译
- 下载:https://www.openssl.org/source/
- 安装 OpenSSL, 请确保你已安装以下组件:
二. 安装
三. 生成密钥
生成的密钥的路径是你当前执行命令的路径
这里默认生成1024长度密钥
公钥是基于私钥来生成的,所以必须先生成私钥
1.JAVA端加密
其实单一语言的加解密都还是比较简单的,关键在于跨语言的兼容问题上。
而且需要特别注意的是我使用的RSA长度是1024
的,也就是说我单个需要加密的数据的长度不能超过1024/8-11=117
,实际测试单条数据最大长度是116 bytes
。
如果需要扩大需要加密的单条数据的长度,只需要在生成公钥的时候设置对应的长度即可。((数据长度+12)*8=密钥长度)
其中RSA_ALGORITHM
设置的是算法的使用模式,因为Python端使用的是OAEP
所以这里用的是RSA/ECB/OAEPWithSHA-256AndMGF1Padding
在Java端我们使用的公钥格式是DER
,如果使用PEM
则会出现异常
2.Python端解密
Python端可以使用的模块是很多的,通常可以用
rsa、Crypto、PyCryptodome、PyCrypt
等,需要注意的是其中PyCrypt
已经停止维护了不建议使用,但是幸运的是PyCryp
t有一个分支叫PyCryptodome
.
为了便于阅读,Java端对加密后的数据进行了Base64的格式转换,因此在Python端也同样需要对获取的加密后的数据进行Base64的转换后再进行解密.
通过观察,发现加密后进行Base64转换后的数据结束符为“
==
”,因此我在这里是直接根据结束符进行拆分数据的,拆分后的数据分别解密后放在同一个字符串集合里面,这里你不需要但是如果出现换行的情况是否还需要自己手动设置换行,当解密后原有的换行符依然可用.
但是需要注意的是在windows环境下文件的换行符是"
\r\n
",加密后依然加密的是"\r\n
",但是,但我们解密后写入文件的时候应当替换"\r\n
"为"\n
",否则你会发现多了一行换行,因为当Python重写写入文件的时候认为"\r\n
"为“回车换行
”,所以体现在文件中就是两次换行的效果了.
在
_init()
方法中获取私钥的位置只需要把os.path.join(os.path.dirname(os.getcwd()), "config", "rsa_private_key.pem")
替换成你自己的私钥路径即可.
在Python端我们使用的私钥格式是
PEM
.
- 感谢你赐予我前进的力量