Java AES 解密导致 BadPaddingException

Java AES decryption causing BadPaddingException

我正在尝试创建 AES encryption/decryption 方法,但我似乎无法在不使用 AES/ECB/NoPadding 的情况下获得原始输入。现在我正在尝试使用 AES/CBC/PKCS7Padding。我已经确认读取和写入字节 to/from 文件工作正常。使用 PKCS7 填充,我从

得到了 BadPaddingException
cipher.doFinal(encrypted)

在解密方法中。没有填充,没有例外——但是输出被打乱了。我已经花时间浏览了关于这个完全相同问题的其他帖子,但我似乎无法找到适合我的问题的解决方案。

如何解读该输出?

protected boolean encrypt(String place, String encrypt) {
    try {

        // encrypt the text
        cipher.init(Cipher.ENCRYPT_MODE, aesKey);
        byte[] encrypted = cipher.doFinal(encrypt.getBytes());

        Context context = HomeViewActivity.hva.getApplicationContext();
        FileOutputStream writer = context.openFileOutput(file_name.get(place.toUpperCase()), Context.MODE_PRIVATE);
        writer.write(encrypted);
        writer.close();
        return true; //successfully wrote encrypted string to file
    }catch(Exception e) {
        e.printStackTrace();
    }
    return false;
}
protected String decrypt(String place){
    String decrypted = null;
    try{
        Context context = HomeViewActivity.hva.getApplicationContext();
        // decrypt the text
        cipher.init(Cipher.DECRYPT_MODE, aesKey);
        FileInputStream reader = context.openFileInput(file_name.get(place.toUpperCase()));
        byte[] encrypted = new byte[reader.available()];
        reader.read(encrypted);
        reader.close();
        decrypted= new String(cipher.doFinal(encrypted));
    }catch(FileNotFoundException e){return null;}
    catch(IllegalBlockSizeException |
            BadPaddingException |
            InvalidKeyException |
            NoSuchAlgorithmException |
            IOException |
            NoSuchPaddingException e){e.printStackTrace();}
    return decrypted;
}

编辑 1:使从文件中读入的加密数组具有适当的大小

编辑 2:在构造函数而不是每个方法中初始化密钥和密码

问题在于 ECB 不使用 IV 而 CBC - 大多数其他 操作模式 确实使用 IV 值。 Java在未显式给出IV值时随机化,即解密后的明文不正确

对于 AES CBC 模式,这意味着明文的前 16 个字节(初始块)包含随机字符。由于初始块之后的块包含普通明文,因此您不会在代码中得到 BadPaddingException

这个问题的正常解决方法是将IV值前缀到密文中或者先写到底层流中。不用说,您必须在解密期间检索 IV,并在解密期间 跳过 IV 值,方法是更改​​缓冲区中的偏移量或推进流(对于您可能不想复制的文件整个密文)。