java中的错误解密

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;

我正在尝试用Java加密/解密字符串。在sqlite表中存储的加密没有问题。但我在解密时总是遇到同样的错误:

“java.security.InvalidKeyException:未设置预期的IV”

以下是我的代码片段:

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);