如何编写Python代码解密Java端AES/GCM/NoPadding加密的文本
AES-GCM Java加解密等效Python解密代码
前置依赖
首先安装加解密依赖库:pip install pycryptodome
核心逻辑对齐说明
和Java代码完全对齐的处理逻辑:
- 原始密钥先做MD5哈希,哈希结果转小写十六进制字符串,取该字符串的UTF-8编码字节作为AES-256密钥
- 使用固定IV值:
0123456789ABCDEF的UTF-8编码字节(Java代码重复定义了IV,以后面的16位版本为准) - GCM认证标签长度为128位
- 待解密内容为Base64编码格式,解密后结果为UTF-8编码的明文
完整代码
import base64 import hashlib from Crypto.Cipher import AES # 配置和Java代码完全对齐 # 若实际使用Java中第一个32位IV,替换为b"0123456789ABCDEF0123456789ABCDEF"即可 FIXED_IV = b"0123456789ABCDEF" DEFAULT_KEY = "super secret" TAG_LENGTH = 16 # 对应Java的128位认证标签长度 def aes_gcm_decrypt(encrypted_b64: str, secret_key: str = DEFAULT_KEY) -> str: # 1. 处理密钥:和Java逻辑一致,MD5哈希后转小写十六进制,再取字节作为AES密钥 md5 = hashlib.md5() md5.update(secret_key.encode("utf-8")) key_hex = md5.hexdigest().lower() aes_key = key_hex.encode("utf-8") # 2. 解码Base64加密内容 encrypted_data = base64.b64decode(encrypted_b64) # 3. 初始化GCM解密器 cipher = AES.new(aes_key, AES.MODE_GCM, nonce=FIXED_IV, mac_len=TAG_LENGTH) # 4. 解密并校验认证标签 try: # Java加密输出结构为「密文+16位标签」,拆分后传入解密校验 plain_bytes = cipher.decrypt_and_verify(encrypted_data[:-TAG_LENGTH], encrypted_data[-TAG_LENGTH:]) return plain_bytes.decode("utf-8") except ValueError: raise Exception("解密失败,可能是密钥错误、内容被篡改或IV不匹配") # 示例使用 if __name__ == "__main__": # 替换为Java加密生成的Base64字符串即可 encrypted_text = "替换为待解密的Base64内容" try: result = aes_gcm_decrypt(encrypted_text) print("解密结果:", result) except Exception as e: print("错误:", str(e))
内容的提问来源于stack exchange,提问作者Pradeep
相关产品推荐
相关产品推荐

