将CipherInputStream写入文本文件

时间:2018-05-14 06:20:41

标签: java encryption

我试图解密存储在文本文件中的加密数据。我使用相同的密钥和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 :(得分:2)

  

存储在文本文件中的加密数据

这已经是一个矛盾了。加密数据是二进制文件,而不是文本,不应存储在.txt扩展名的文件中。

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

这行代码毫无意义。你还不知道解密数据会有多长。解密的文件甚至可能不存在,在这种情况下,这将产生零长度数组;或者它可能与即将生产的东西不同,在这种情况下它的长度是错误的。

inputStream.read(inputBytes);

删除此行及其前一行。

  1. 它读入一个最大大小与解密数据大小相关的数组,这对于加密数据来说是错误的大小,最坏的是大小错误,甚至是零长度,如上所示。
  2. 它可能读取输入,直到错误大小的缓冲区已满,然后您(a)完全忽略读取的数据和(b)尝试进一步读取相同的流,这将在解密循环中失败,或者最多产生错误的输出,因为您可能无法解密所有数据。
  3.   

    当我将CipherInputStream打印到控制台时,我确实得到了一些内容

    不,你没有。您会获得一般格式CipherInputStream@0011223344的数据,这只是调用CipherInputStream.toString()的结果,包含任何内容'。