Запись CipherInputStream в текстовый файл - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь расшифровать зашифрованные данные, которые хранятся в текстовом файле.Я использую тот же ключ и IV для шифрования и дешифрования и передачи его через файл конфигурации.

Когда я печатаю CipherInputStream на консоль, я получаю некоторый контент, но когда я пытаюсь записать его в текстовый файл, яне получайте никакого содержания.

Этот фрагмент кода относится к моей проблеме:

File encryptedData = new File("C:\\Users\\Victoria\\Desktop\\encryptedData.txt");
File decryptedData = new File("C:\\Users\\Victoria\\Desktop\\decryptedData.txt");
FileInputStream inputStream = new FileInputStream(encryptedData);
byte[] inputBytes = new byte[(int) decryptedData.length()];
inputStream.read(inputBytes);

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, newkey, newiv, SecureRandom.getInstance("SHA1PRNG"));
CipherInputStream cipherInputStream = new CipherInputStream(inputStream, cipher);
FileOutputStream outputStream = new FileOutputStream(decryptedData);
System.out.println("cipherInputStream: " + cipherInputStream);  

// Writing the decrypted content to an output file
byte[] buff = new byte[1024 * 10];
int length;
while ((length = cipherInputStream.read(buff)) > 0) {
    outputStream.write(buff, 0, length);
}
bufin.close();
outputStream.close();
cipherInputStream.close();

Есть какие-нибудь решения?Спасибо!

1 Ответ

0 голосов
/ 14 мая 2018

Зашифрованные данные, которые хранятся в текстовом файле

Это уже противоречие в терминах.Зашифрованные данные являются двоичными, а не текстовыми и не должны храниться в файлах с расширением .txt.

byte[] inputBytes = new byte[(int) decryptedData.length()];

Эта строка кода не имеет смысла.Вы еще не знаете, как долго будут расшифрованы данные.Расшифрованный файл может даже не существовать, и в этом случае будет получен массив нулевой длины;или это может отличаться от того, что должно быть произведено, и в этом случае это неправильная длина.

inputStream.read(inputBytes);

Удалите эту строку и ту, что перед ней.

  1. Этосчитывает в массив, размер которого в лучшем случае соответствует размеру дешифрованных данных, что является неправильным размером для зашифрованных данных, а в худшем - просто неправильного размера или даже нулевой длины, как показано выше.
  2. Он считывает входные данные, вероятно, до тех пор, пока этот буфер неправильного размера не заполнится, и затем вы (а) полностью игнорируете считанные данные и (б) пытаетесь читать тот же поток дальше, что приведет к сбою в цикле дешифрования, или в лучшем случае приведет к неправильному выводу, поскольку вы, возможно, не расшифровываете все данные.

Когда я печатаю CipherInputStream на консоль, я получаю некоторый контент

Нет, вы этого не делаете.Вы получаете фрагмент данных общего вида CipherInputStream@0011223344, который является просто результатом вызова CipherInputStream.toString(), который не содержит какой-либо «контент».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...