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 值,方法是更改缓冲区中的偏移量或推进流(对于您可能不想复制的文件整个密文)。
我正在尝试创建 AES encryption/decryption 方法,但我似乎无法在不使用 AES/ECB/NoPadding 的情况下获得原始输入。现在我正在尝试使用 AES/CBC/PKCS7Padding。我已经确认读取和写入字节 to/from 文件工作正常。使用 PKCS7 填充,我从
得到了 BadPaddingExceptioncipher.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 值,方法是更改缓冲区中的偏移量或推进流(对于您可能不想复制的文件整个密文)。