java - 在java中解密时出错

标签 java android sqlite encryption

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

“java.security.InvalidKeyException:没有按预期设置 IV”

这是我的代码 fragment :

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

我做错了什么?

最佳答案

您需要在 cipher.init() 方法中指定一个初始化 vector :

IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.DECRYPT_MODE,keySpec, ivSpec);

参见:http://docs.oracle.com/javase/1.5.0/docs/api/javax/crypto/spec/IvParameterSpec.html

初始化 vector 应该是一个随机字节数组,讨论见:

http://en.wikipedia.org/wiki/Initialization_vector

关于java - 在java中解密时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13253783/

相关文章:

android - 如何在sqlite中连续查询每个单词的首字母?

java - 在两个 JavaFX Controller 之间传递参数

java - 从两个列表中查找缺失的数字

java - 为什么\R 在 Java 8 和 Java 9 之间的正则表达式中表现不同?

android - 如何删除所有 Activity 的地理围栏?

android - 在 Android strings.xml 文件中使用 HREF

java - 我无法理解这段代码

java - 如何连续触发或发送 Intent (无需单击按钮)

windows - 需要建议 : simple cross platform (OS-X and Windows) + SQLite development without installation

sqlite - TFS 2012 构建和适用于 WinRT 的 SQLite