PythonJavaAES加解密⽅法互转
背景介绍
公司的接⼝有签名校验,请求头中包含了请求的时间戳,所以这种接⼝必须动态⼊参,否则⽆法请求成功。
层层加密⽅法嵌套中,最为棘⼿的就是AES加/解密的⽅法。
倒不是说AES本⾝加密⽅法有多复杂,⽽是两种IDE的AES第三⽅包存在⼩部分差异。
Java中AES加/解密的填充⽅式是封装过的,⽽Python的AES就需要⾃⼰去定义填充⽅式。
查看了Java的AES封装⽅法的源代码,发现默认采⽤是pack5padding的填充⽅式。
在知道原理后,其实⽤Python去构造这种填充⽅式并不难。
好了,b话不多说,直接上代码。
正⽂
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@File:blog_test_code.py
@E-mail:364942727@qq
@Time:2020/9/8 10:08 下午
@Author:Nobita
@Version:1.0
@Desciption:None
"""
import base64
import requests
from Crypto.Cipher import AES
from urllib import parse
class MyHash(object):
def__init__(self):
"""
:param mode: AES加密模式
"""
def My_Aes_Encrypt(self, key, msg):
"""
Aes 算法加密( MODE = AES.MODE_ECB;⽆VI偏移量;)
:
param key: 需加密的密钥
:param msg: 需加密的字符串
:return:
"""
self.key = key
self.BS = len(key)
self.pad = lambda s: s + (self.BS - len(s) % self.BS) * chr(self.BS - len(s) % self.BS)
Cryptor = w(de("utf8"), de)
self.ciphertext = pt(bytes(self.pad(msg), encoding="utf8"))
# AES加密时候得到的字符串不⼀定是ascii字符集的,输出到终端或者保存时候可能存在问题,使⽤base64编码
bin_encrypt_result = base64.b64encode(self.ciphertext) # 输出的是⼆进制Unicode编码
return bin_encrypt_result.decode('utf8')
def My_Aes_Decrypt(self, key, msg):
"""
Aes 算法解密( MODE = AES.MODE_ECB;⽆VI偏移量;)
:param key: 需解密的密钥
:param msg: 需解密的字符串
:return:
"""
self.key = key
self.BS = len(key)
self.unpad = lambda s: s[0:-ord(s[-1:])]
decode = base64.b64decode(msg)
Cryptor = w(de("utf8"), de)
self.plain_text = Cryptor.decrypt(decode)
bin_decrypt_result = self.unpad(self.plain_text) # 输出的是⼆进制Unicode编码
return bin_decrypt_result.decode('utf8')
def My_Aes(self, key, msg):
"""
Java 加/解密⼯具类接⼝
python转java代码:param key: 需加密的密钥
:param msg: 需加密的字符串
:return: 加密后的字符
"""
# 调⽤本地AES_jar包接⼝
url = '127.0.0.1:4271/aes/encrypt'
payload = {
"psw": key,
"content": msg
}
r = requests.post(url=url, data=payload)
res = r.json()['Data']
return res
helo = MyHash()
if__name__ == '__main__':
print('--------------------------------------Python-AES加/解密部分--------------------------------------')
Aes_Key = "WuMlCJRN8zO886dw"
Aes_Encrypt_msg = "<FPXX><NSRSBH>330201999999868</NSRSBH><DDLSH>3302019999998684221</DDLSH></FPXX><FPXX><NSRSBH>330201999999868</NSRSBH>330201999999868</NSRSBH>"
res_Aes_Encrypt = helo.My_Aes_Encrypt(Aes_Key, Aes_Encrypt_msg)
print('Aes加密前字符串:{},\nAes加密结果:{}'.format(Aes_Encrypt_msg, res_Aes_Encrypt))
Aes_Decrypt_msg = "hhCWnmDtU1NxQlXiE+LMiRozGLJpbu2P/2hraeHuWUQdSUtwMmwlRlPzIJqI+lbilCOe9NU3jCm6ZcelKH3eaUie36oiU4X8S94ujyhlP/qL9mKXl4oqlQo+jZzvR2DnMn45V7v3dMQ21D97sdZQvB12t9W/O2wDzBMoKKBcqIeW res_Aes_Decryot = helo.My_Aes_Decrypt(Aes_Key, Aes_Decrypt_msg)
print('Aes解密前字符串:{},\nAes解密解果:{}'.format(Aes_Decrypt_msg, res_Aes_Decryot))
print('--------------------------------------Java⼯具类-AES加/解密部分--------------------------------------')
Java_Encrypt_result = helo.My_Aes(Aes_Key, Aes_Encrypt_msg)
print('Java Aes加密接⼝加密后的结果:{}'.format(Java_Encrypt_result))
从代码中,我们清晰的能看到,我拿⾃⼰⽤Python写的AES加/解密算法和本地的api调⽤接⼝在进⾏⽐较。
这个api接⼝是⼀个⼯具类jar包,关于AES加/解密算法的。
下⾯附上Pycharm运⾏结果图:
为了⽐较结果更加直观,再贴⼀张Beyond Compare的对⽐图:
结束语
遇到难以攻克的问题时,的确让⼈很不爽。之前这个AES加/解密jar包部署在⼀台虚拟服务器⾥⾯,公
司这两天⽹络波动+三天两头停电,这虚拟服务器也跟着挂掉,我的“命运”也被安排了。。。。
现在总算是可以独⽴开来了。。。这feel倍⼉爽!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论