Android AES解密函数返回null问题求助(附PHP加密代码)
解决AES解密返回null的问题
嘿,我帮你定位到了导致Android端AES解密返回null的核心问题,还顺便发现了PHP代码里的一个小隐患,一起来看看:
核心问题:Android端密钥处理错误
你的PHP加密代码是直接使用原始字符串密钥(比如SeoavcVARXhWKdQ5)进行加密的,但Android的解密代码里却错误地对密钥做了Base64解码操作:
// 错误的代码 SecretKeySpec k = new SecretKeySpec(Base64.decode(key, Base64.DEFAULT), "AES");
这会导致实际使用的密钥和PHP端完全不匹配,进而触发解密失败(通常是BadPaddingException,被catch后返回null)。
正确的做法是直接使用密钥的UTF-8字节,不需要Base64解码:
// 修正后的代码 SecretKeySpec k = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
额外修正:PHP代码的变量错误
你的PHP加密函数里,当密钥长度超过16位时,substr的参数写错了:
// 错误的代码 $key = substr($str, 0, AESCipher::$CIPHER_KEY_LEN);
这里的$str应该是$key,否则会抛出未定义变量的错误,修正后:
$key = substr($key, 0, AESCipher::$CIPHER_KEY_LEN);
修正后的完整Android decrypt函数
import android.util.Base64; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class AESCipher { private static String CIPHER_NAME = "AES/CBC/PKCS5PADDING"; private static int CIPHER_KEY_LEN = 16; //128 bits public static String decrypt(String key, String initVector, String data) { try { IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8")); Cipher c = Cipher.getInstance(AESCipher.CIPHER_NAME); // 修正密钥处理逻辑 SecretKeySpec k = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); c.init(Cipher.DECRYPT_MODE, k, iv); byte[] decodedEncryptedData = Base64.decode(data, Base64.DEFAULT); byte[] original = c.doFinal(decodedEncryptedData); return new String(original); } catch (Exception e) { // 建议打印异常详情,方便后续排查 e.printStackTrace(); System.out.println("解密异常:" + e.getMessage()); } return null; } }
验证示例
用你提供的测试数据:
- 明文:
test - 密钥:
SeoavcVARXhWKdQ5 - 向量iv:
TeoavcVARXhWKdQ5 - 密文:
NnUDIfVXvtamcrYWvs9HWw==
调用修正后的decrypt方法,应该能成功返回test。
内容的提问来源于stack exchange,提问作者AdrianRO
相关产品推荐
相关产品推荐

