AES256解密抛出AEADBadTagException(BAD_DECRYPT)问题排查
密码派生逻辑不一致:加密和解密时从字符串密码生成密钥的流程必须完全一致。比如加密时用了特定盐值、迭代次数、哈希算法(如PBKDF2WithHmacSHA256),解密时如果盐值不同、迭代次数不匹配,生成的密钥就会错误,直接导致解密失败。务必保证加密时将盐值和密文一起存储(比如写入文件头部),解密时读取同一个盐值来派生密钥。
GCM模式附加认证数据(AAD)不匹配:如果使用AES-GCM这类AEAD算法,加密时指定了AAD,解密时必须传入完全相同的AAD内容,否则会触发完整性验证失败。检查加密和解密代码中AAD的处理逻辑,确认没有遗漏或传入不同内容。
初始化向量(IV)错误:AES-GCM要求IV必须唯一,且解密时必须使用和加密时完全相同的IV。通常加密时会生成随机IV并和密文一起存储(比如文件开头),解密时要先读取该IV再初始化Cipher。如果解密时重新生成随机IV或读取的IV长度/内容错误,就会触发异常。
文件读写过程中字节丢失或错位:大文件分块处理时,要确保每块字节都被正确读写,没有遗漏或额外添加。比如加密时将IV、盐值等元数据写入文件头部,解密时读取这些元数据的长度必须准确,否则后续密文读取位置错误,导致解密失败。检查分块缓冲区的处理逻辑,确认最后一块字节没有被截断。
Cipher实例初始化错误:加密和解密时的Cipher初始化参数必须严格对应。比如加密用
Cipher.ENCRYPT_MODE,解密用Cipher.DECRYPT_MODE,且密钥、IV、AAD的设置顺序要正确。如果解密时初始化Cipher步骤有误(比如忘记设置AAD、模式错误),也会触发该异常。加密后文件被篡改:AEAD算法会验证密文完整性,只要加密后的文件被修改(哪怕一个字节),解密时就会抛出BadTag异常。可以先校验加密前后文件的哈希值,确认文件未被篡改。
内容的提问来源于stack exchange,提问作者Jagar

