0

我正在尝试创建 AES 加密/解密方法,但如果不使用 AES/ECB/NoPadding,我似乎无法获得原始输入。现在我正在尝试使用 AES/CBC/PKCS7Padding。我已经确认从文件中读取和写入字节工作正常。使用 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:在构造函数中初始化密钥和密码,而不是每个方法

4

1 回答 1

1

问题是 ECB 不使用 IV 而 CBC - 以及大多数其他操作模式确实使用 IV 值。Java在IV值没有明确给出的时候会随机化,也就是说解密后的明文是不正确的。

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

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

于 2015-03-01T12:24:41.303 回答