我试图解密存储在文本文件中的加密数据。我使用相同的密钥和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();
任何解决方案? 谢谢!
答案 0 :(得分:2)
存储在文本文件中的加密数据
这已经是一个矛盾了。加密数据是二进制文件,而不是文本,不应存储在.txt
扩展名的文件中。
byte[] inputBytes = new byte[(int) decryptedData.length()];
这行代码毫无意义。你还不知道解密数据会有多长。解密的文件甚至可能不存在,在这种情况下,这将产生零长度数组;或者它可能与即将生产的东西不同,在这种情况下它的长度是错误的。
inputStream.read(inputBytes);
删除此行及其前一行。
当我将CipherInputStream打印到控制台时,我确实得到了一些内容
不,你没有。您会获得一般格式CipherInputStream@0011223344
的数据,这只是调用CipherInputStream.toString()
的结果,不包含任何内容'。