You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Java AES/GCM加密代码转换为Python 解决MAC校验失败问题

问题根因

你写的Python代码存在三个核心逻辑错误,和Java原始实现不匹配,导致MAC校验失败:

  • 编码逻辑错误:Java实现先将12字节nonce + 密文 + 16字节tag拼接为完整字节数组后,整体做Base64编码;你的代码是分别对三个部分做Base64后再拼接字符串,结果和Java输出完全不一致。
  • 多余字符拼接:你在URL编码前给Base64结果额外拼接了\n换行符,Java实现无该逻辑,相当于篡改了加密结果。
  • 冗余无效代码:声明的v1 = bytearray(len12)变量未使用,属于无效代码。
正确实现代码
import base64
from Crypto.Cipher import AES
import urllib.parse
from Crypto.Random import get_random_bytes

data = "shouldEncryptDATA"
# 密钥和Java实现完全一致
key = b'1f1f7892GKG38815'
# 生成12字节随机nonce,和Java逻辑对齐
nonce = get_random_bytes(12)

# 初始化AES-GCM加密器,默认16字节tag长度和Java配置的128位tag完全匹配
cipher = AES.new(key, AES.MODE_GCM, nonce=nonce)
# 加密得到纯密文和校验tag
ciphertext, tag = cipher.encrypt_and_digest(data.encode("utf-8"))

# 按Java逻辑拼接完整字节流:nonce在前,后跟密文,最后是tag
full_crypto_bytes = nonce + ciphertext + tag
# 整体做Base64编码
base64_result = base64.b64encode(full_crypto_bytes).decode('utf-8')
# URL编码,和Java URLEncoder.encode逻辑对齐
url_encoded_result = urllib.parse.quote_plus(base64_result)

print(url_encoded_result)
效果说明

上述代码完全对齐Java原始实现的加密流程,输出的加密结果可直接被原有解密逻辑正常解析,不会出现MAC校验失败问题。

内容的提问来源于stack exchange,提问作者hanan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:36:05