Android AES解密返回特殊字符问题V2.0
解决AES解密异常的分步排查方案
咱们先拆解你遇到的问题核心:你手里的加密串和密钥都是Base64编码格式,解密前必须先做解码操作,另外AES解密的关键参数(加密模式、填充方式、IV向量)缺失,这大概率是你抛出异常的主要原因。我一步步帮你梳理排查:
1. 先处理Base64解码(基础前提)
你的密钥ZzRtNDNuY3J5cHRrM3kuLi4=和加密串RnLObq9hdUDGp9S2pxC1qjQXekuf9g6i/5bQfKilYn4=都是Base64编码的,必须先解码成原始字节数组才能用于AES操作。
给你一个Java环境下的解码示例:
// 解码256位AES密钥 byte[] keyBytes = Base64.decode(AesKey256, Base64.DEFAULT); // 解码读取到的加密内容 byte[] encryptedBytes = Base64.decode(res.getContents(), Base64.DEFAULT);
这里要重点验证:解码后的密钥字节长度必须是32字节(因为是AES-256),如果长度不对,说明密钥的Base64编码或者原始密钥本身有问题,直接会导致解密失败。
2. 确认AES加密参数(核心关键!)
AES解密必须和加密时使用的**模式(Mode)、填充方式(Padding)、IV向量(如果是CBC/GCM等模式)**完全一致,否则必然抛出异常。你目前没提供这些信息,这是最常见的解密失败诱因。
常见的合规加密组合有:
- AES/CBC/PKCS5Padding:需要16字节的IV向量,通常加密方会把IV和加密串一起返回(比如拼接在加密串前或者单独传递)
- AES/GCM/NoPadding:需要IV和认证标签,是更安全的现代加密方案
- AES/ECB/PKCS5Padding:不需要IV,但ECB模式存在安全漏洞,不推荐使用
务必和加密方确认完整的加密方案细节,这一步不能省略。
3. 参考解密代码框架(以CBC模式为例)
假设加密方使用的是AES-256-CBC + PKCS5Padding,且提供了Base64编码的IV向量,这里给你一个可参考的代码模板:
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import android.util.Base64; public String decryptAESContent(String encryptedStr, String keyBase64, String ivBase64) throws Exception { // 解码密钥、加密串、IV byte[] keyBytes = Base64.decode(keyBase64, Base64.DEFAULT); byte[] encryptedBytes = Base64.decode(encryptedStr, Base64.DEFAULT); byte[] ivBytes = Base64.decode(ivBase64, Base64.DEFAULT); // 构建密钥和IV规格 SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES"); IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); // 初始化解密Cipher Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec); // 解密并转UTF-8字符串 byte[] decryptedBytes = cipher.doFinal(encryptedBytes); return new String(decryptedBytes, "UTF-8"); }
4. 常见异常的排查方向
- BadPaddingException:大概率是填充方式不匹配,或者密钥/IV错误,也可能是加密串被篡改
- InvalidKeyException:密钥长度不符合要求(比如AES-256需要32字节),或者设备未开启AES-256支持(Android部分设备需要额外配置)
- IllegalBlockSizeException:加密串解码后的字节长度不是16字节(AES块大小)的整数倍,可能是Base64解码错误或加密参数不匹配
5. 额外建议
- 先打印解码后的密钥字节长度、加密串字节长度,确认基础数据没有问题
- 检查
res.getContents()读取的加密串是否完整,有没有被截断或编码错误 - 优先和加密方同步加密方案的所有细节,不要自行猜测参数
内容的提问来源于stack exchange,提问作者Emilio Calderon Vergara
相关产品推荐
相关产品推荐

