java中的错误解密
我正在尝试用Java加密/解密字符串。在sqlite表中存储的加密没有问题。但我在解密时总是遇到同样的错误: “java.security.InvalidKeyException:未设置预期的IV” 以下是我的代码片段:java中的错误解密,java,android,sqlite,encryption,Java,Android,Sqlite,Encryption,我正在尝试用Java加密/解密字符串。在sqlite表中存储的加密没有问题。但我在解密时总是遇到同样的错误: “java.security.InvalidKeyException:未设置预期的IV” 以下是我的代码片段: public String encrypt(String password){ try { String key = "mysecretpassword"; SecretKeySpec keySpec = null;
public String encrypt(String password){
try
{
String key = "mysecretpassword";
SecretKeySpec keySpec = null;
keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
return new String(cipher.doFinal(password.getBytes()));
}
catch (Exception e)
{
return null;
}
}
public String decrypt(String password){
try
{
String key = "mysecretpassword";
SecretKeySpec keySpec = null;
keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.DECRYPT_MODE,keySpec);
return new String(cipher.doFinal(password.getBytes()));
}
catch (Exception e)
{
System.out.println(e);
return null;
}
}
我做错了什么?您需要一个合适的AES密钥,请尝试:
String key = "mysecretpassword";
KeySpec spec = new PBEKeySpec(key.toCharArray(), Salt, 12345678,256);
SecretKey encriptionKey = factory.generateSecret(spec);
Key encriptionKey = new SecretKeySpec(encriptionKey.getEncoded(), "AES");
您需要在cipher.init()方法中指定一个初始化向量: 见: 初始化向量应为随机字节数组,有关讨论,请参阅:
谢谢!文档和您的代码片段非常有用!有同样的问题,我不明白,为什么它在加密时工作,在解密时失败?除非在encrypt中不设置IV,否则会生成一个随机的IV?只是为了跟进我之前的评论。是的,您需要设置一个与@Udo如下所示类似的IV。可能是重复的
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.DECRYPT_MODE,keySpec, ivSpec);