我有一个例外,无法初始化密码,我无法解决它
这是代码:
public static String decryptAES(String dataEncrypt, String key) throws Exception {
synchronized(decryptLock) {
String dataDecrypted = new String();
try {
Cipher aesCipher = getAesCipher();
byte[] raw = hexToBytes(key);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
aesCipher.init(Cipher.DECRYPT_MODE, skeySpec, aesCipher.getParameters());
byte[] decordedValue = DatatypeConverter.parseBase64Binary(dataEncrypt);
byte[] byteDecryptedText = aesCipher.doFinal(decordedValue);
dataDecrypted = new String(byteDecryptedText);
return dataDecrypted;
} catch (Exception ex) {
log.error("error decryptAES " +ex.getMessage());
}
return dataDecrypted;
}
这是功能getAesCipher():
private static synchronized Cipher getAesCipher() throws NoSuchAlgorithmException, NoSuchPaddingException{
if (_aesCipher == null) {
_aesCipher = Cipher.getInstance("AES");
}
return _aesCipher;
}
有时查看日志,我看到日志错误异常,但我无法解决它
这是日志错误:
(EncryptManager.java:decryptRSA(82)) - running decryptRSA ....
(EncryptManager.java:decryptAES(624)) - error decryptAES Could not initialize cipher
请帮帮我!感谢
答案 0 :(得分:0)
在不知道更多信息的情况下,我建议您验证提供给方法的十六进制键值。我没有看到确切的错误消息,但是当初始化期间密钥参数对密码无效时,可以抛出InvalidKeyException
(密钥不是算法的有效长度,密钥长度不受支持JVM,因为未安装JCE Unlimited Strength Jurisdiction Policy文件等)。
你是如何第一次实例化_aesCipher
的?如果只是您发布的代码将其设置为Cipher
的实例,则在致电cipher.init()
时,您可能不需要传递参数。但是,您可能希望查看使用IV并传递IvParameterSpec
以提高此代码的安全性。您还应该在实例化密码时指定mode of operation和填充方案,因为Java将默认为ECB
,这是非常不安全的。