AES解密失败:初始化向量IV缺失引发的Parameters missing异常及解决方案
AES加密解密过程中,正确使用初始化向量(IV)至关重要。本文分析一个AES解密失败案例,并提供有效解决方案。
问题描述:
一段AES加密解密代码在解密阶段报错,显示java.security.InvalidKeyException: Parameters missing。代码使用AES/CBC/PKCS5Padding模式,加密时随机生成IV并与密文拼接,解密时尝试从拼接数据中提取IV再解密。然而,解密抛出Parameters missing异常。
代码片段(有问题的部分):
解密部分:
// ... 其他代码 ... byte[] removeBytes = Arrays.copyOf(decryptStr, decryptStr.length - 16); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBytes, "AES")); // 此处错误 byte[] byteData = cipher.doFinal(removeBytes); // ... 其他代码 ...
错误原因分析:
问题在于解密时cipher.init方法的调用。AES/CBC/PKCS5Padding模式需要提供IV。代码虽然提取了IV,但cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBytes, "AES"))只设置了密钥,缺少IV参数,导致Parameters missing异常。
解决方案:
正确调用cipher.init方法应包含密钥和IV参数:
IvParameterSpec ivParameterSpec = new IvParameterSpec(Arrays.copyOfRange(decryptStr, decryptStr.length - 16, decryptStr.length)); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBytes, "AES"), ivParameterSpec);
修改后的代码使用Arrays.copyOfRange方法正确提取IV进行解密初始化,避免Parameters missing异常。 关键在于解密时不能使用加密密钥作为IV,而必须使用加密时生成的IV。
通过以上修改,可以解决AES解密中因IV缺失导致的Parameters missing异常。 确保在加密和解密过程中始终正确处理和传递IV,才能保证AES加密解密的正常运行。
以上就是AES解密失败:初始化向量IV缺失导致Parameters missing异常如何解决?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号