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

Android中Gson JsonObject转Base64再AES256加密后JSON格式异常

问题分析与解决方案

你遇到的JSON格式错误问题,核心是多做了一次不必要的Base64编码,导致服务器解密后得到的不是原始JSON字符串,而是Base64编码后的文本,自然无法正常解析为JSON格式。

错误流程拆解

你当前的处理步骤存在冗余:

  1. JsonObject → JSON字符串
  2. JSON字符串 → UTF-8字节 → Base64编码字符串
  3. Base64字符串 → 字节 → AES加密
  4. 加密字节 → Base64编码字符串(最终发送内容)

步骤2的Base64编码完全是多余操作,它会让后续加密的对象从原始JSON字节流变成Base64文本的字节流,服务器解密后得到的是Base64格式的字符串,而非原始JSON,因此触发格式错误。

修正后的正确代码

// 1. 构建目标JsonObject
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("command", "abc");

// 2. 直接将JSON字符串转为UTF-8字节,跳过不必要的Base64编码
byte[] jsonBytes = jsonObject.toString().getBytes(StandardCharsets.UTF_8);

// 3. 对原始JSON字节执行AES加密
byte[] encryptedBytes = aesKeyIv.cipherEnc.doFinal(jsonBytes);

// 4. 将加密后的字节转为Base64字符串,用于网络发送
String finalBody = Base64.encodeToString(encryptedBytes, Base64.NO_WRAP);

同时建议调整你的加密方法,直接接收字节参数,减少不必要的字符串-字节转换,避免编码隐患:

public String encrypt(byte[] valueBytes) throws Exception {
    byte[] encrypted = cipherEnc.doFinal(valueBytes);
    return Base64.encodeToString(encrypted, Base64.NO_WRAP);
}

调用时直接传入jsonBytes即可:

String finalBody = aesKeyIv.encrypt(jsonBytes);

额外注意事项

  • 确保cipherEnc的初始化符合AES-256要求:比如使用AES/GCM/NoPadding(更安全)或AES/CBC/PKCS5Padding模式,密钥长度必须为32字节,CBC模式下IV长度需为16字节。
  • 始终明确指定字符编码(比如StandardCharsets.UTF_8),避免依赖系统默认编码,防止不同设备/平台出现编码不一致问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:31:22