EVP_SealInit加密的aes-256-cbc数据解密报EVP_DecryptFinal_ex:bad decrypt错误
EVP_DecryptFinal_ex:bad decrypt 问题排查指南
在确认RSA私钥解密得到的原始AES密钥完全正确的前提下,报错基本来自对称解密流程的参数或逻辑错误,可按以下优先级排查:
- 校验密钥、IV长度匹配度:aes-256-cbc算法要求32字节长度的密钥、16字节长度的IV,如果密钥、IV在传输、存储过程中发生截断、拼接了冗余字节,会直接导致解密失败。可先打印加密端、解密端的密钥、IV的十六进制值做逐位对比
- 确认解密上下文初始化参数正确:调用
EVP_DecryptInit_ex时必须明确指定算法为EVP_aes_256_cbc(),不要误传为其他AES变体,同时注意不要搞混密钥和IV的传参顺序 - 校验密文完整性:加密输出的密文如果被篡改、丢包、末尾填充位被修改,都会触发最终的填充校验失败。可先对比加密端输出密文的MD5/SHA256哈希与解密端接收到的密文哈希是否完全一致
- 检查填充模式是否统一:OpenSSL的EVP系列接口默认启用PKCS#7填充,如果加密端手动关闭了填充(调用
EVP_CIPHER_CTX_set_padding(ctx, 0)),解密端也必须同步关闭填充,否则EVP_DecryptFinal_ex在校验填充位时会直接抛出bad decrypt错误 - 核对解密输出逻辑:最终明文长度是
EVP_DecryptUpdate输出的长度与EVP_DecryptFinal_ex输出的长度之和,不要只截取其中某一段输出作为明文,避免有效数据丢失
高频踩坑点:不少开发者会误将RSA解密后得到的密钥的Base64编码值作为解密密钥传入,而非原始二进制密钥,或是误用了GCM模式的12字节IV长度适配CBC模式,都是引发该报错的常见原因
内容的提问来源于stack exchange,提问作者Anu
相关产品推荐
相关产品推荐

