У меня есть следующая функция для шифрования файлов. Я напечатал результат обоих файлов, и все, кажется, работает должным образом.
Зашифрованный файл изменяется и имеет ту же длину, что и входной файл.
public void encrypt(String password, String filePath){
InputStream is = null;
OutputStream os = null;
CipherOutputStream cos = null;
try {
is = new FileInputStream(new File(filePath));
os = new FileOutputStream(new File(filePath + ".enc"));
char[] passwordChars = password.toCharArray();
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(passwordChars, salt, 1024, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey key = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, key, iv);
cos = new CipherOutputStream(os, c);
byte[] b = new byte[1024];
while(is.read(b) != -1)
cos.write(b);
b = new byte[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (os != null)
os.close();
if (is != null)
is.close();
if (cos != null)
cos.close();
} catch (IOException e) {
}
}
}
Проблема возникает, когда я пытаюсь расшифровать файл впоследствии. Я использую CipherInputStream со следующей функцией:
public void decrypt(String password, String filePath){
InputStream is = null;
OutputStream os = null;
CipherInputStream cis = null;
try {
is = new FileInputStream(new File(filePath));
os = new FileOutputStream(new File(filePath + ".dec"));
char[] passwordChars = password.toCharArray();
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(passwordChars, salt, 1024, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey key = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, key, iv);
cis = new CipherInputStream(is, c);
byte[] b = new byte[1024];
while(cis.read(b) != -1){
os.write(b);
b = new byte[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (os != null)
os.close();
if (is != null)
is.close();
if (cis != null)
cis.close();
} catch (IOException e) {
}
}
}
В то время как l oop не вводится вообще. Он действует так, как будто файл пуст, пока я проверял, и это явно не так. Кажется, шифрование работает правильно, но не расшифровка.
Я попытался изменить функцию на использование CipherOutputStream, но затем произошло то же самое. Я получаю расшифрованный файл длиной 0.
Почему метод дешифрования не работает?