Python/Java AES 加解密方法互相轉換
背景介紹
公司的介面有簽名校驗,請求頭中包含了請求的時間戳,所以這種介面必須動態入參,否則無法請求成功。
之前直接呼叫開發的工具類jar包介面,可最近公司三天兩頭停電,伺服器老掛。。。把我整懵逼了。
網上找了一堆,發現加密出來的都不一樣,,最終決定自己去實現個Python版的AES加/解密方法。
層層加密方法巢狀中,最為棘手的就是AES加/解密的方法。
倒不是說AES本身加密方法有多複雜,而是兩種IDE的AES第三方包存在小部分差異。
Java中AES加/解密的填充方式是封裝過的,而Python的AES就需要自己去定義填充方式。
檢視了Java的AES封裝方法的原始碼,發現預設採用是pack5padding的填充方式。
在知道原理後,其實用Python去構造這種填充方式並不難。
# -*- coding: utf-8 -*-
"""
@File:blog_test_code.py
@E-mail:364942727@qq.com
@Time:2020/9/8 10:08 下午
@Author:Nobita
@Version:1.0
@Desciption:Java AES <---> Python AES
"""
import base64
import requests
from Crypto.Cipher import AES
from urllib import parse
class MyHash(object):
def __init__(self):
"""
:param mode: AES加密模式
"""
self.mode = AES.MODE_ECB
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 = AES.new(self.key.encode("utf8"), self.mode)
self.ciphertext = Cryptor.encrypt(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 = AES.new(self.key.encode("utf8"), self.mode)
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 加/解密工具類介面
:param key: 需加密的金鑰
:param msg: 需加密的字串
:return: 加密後的字元
"""
# 呼叫本地AES_jar包介面
url = 'http://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/O2wDzBMoKKBcqIeWiJybq/MSoGBkrmOzvs1F"
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加解密多版本(GO、JAVA、Python)實現解密GoJavaPython
- Python AES - base64 加解密Python解密
- Java 集合與陣列互相轉換Java陣列
- Java 實現 Map 和 Object 互相轉換的幾種方法JavaObject
- CryptoJS與C#AES加解密互轉JSC#解密
- QString與QByteArray互相轉換的方法
- AES加解密使用總結解密
- .NET AES加解密(128位)解密
- python中列表、字典和字串的互相轉換Python字串
- 字串 列表 字典 互相轉換字串
- VUE專案 AES加解密(小白版)Vue解密
- OpenSSL 使用AES對檔案加解密解密
- Java中String和byte型別互相轉換Java型別
- 使用OpenSSL替代MCrypt實現AES加解密解密
- CryptoJs 使用 AES CBC 加解密資料JS解密
- float與byte[]互相轉換
- 使用AES 128位加解密,加解密模式採用CBC,填充模式採用PKCS5Padding的Java工具方法示例解密模式paddingJava
- MySQL使用AES_ENCRYPT()/AES_DECRYPT()加解密的正確姿勢MySql解密
- Java Stram實現Map和字串之間互相轉換| BaeldungJava字串
- python各種加解密方法Python解密
- netcore AES同等效轉java語言 加密方法NetCoreJava加密
- java json和物件互相裝換JavaJSON物件
- json字串與物件互相轉換JSON字串物件
- GPT與MBR格式 以及互相轉換GPT
- png轉jpg,常用格式怎麼互相轉換
- 20.3 OpenSSL 對稱AES加解密演算法解密演算法
- MySQL中日期和時間戳互相轉換的函式和方法MySql時間戳函式
- jquery物件和DOM物件的互相轉換jQuery物件
- Word中文字與表格互相轉換
- js 陣列,字串,json互相轉換陣列字串JSON
- HTML字串與NSAttributeString互相轉換HTML字串
- []byte轉和[][]string可以互相轉換嗎??
- Js呼叫Java方法並互相傳參JSJava
- 常用加解密工具類(MD5、SHA、DES、AES、RSA)解密
- Java中基本型別Array與複合型別List的互相轉換Java型別
- js資料型別間的互相轉換JS資料型別
- 日期與字串的互相轉換SQL語句字串SQL
- 【JQuery】DOM物件和JQuery物件的互相轉換jQuery物件