所以我有这些大文件(6GB+)需要在 32 位计算机上解密。我之前使用的一般过程是读取内存中的整个文件,然后将其传递给解密函数,然后将其全部写回文件。由于内存限制,这实际上不起作用。我确实尝试将文件部分地传递给解密函数,但它似乎在我将文件发送到解密函数之前分解文件的边界搞砸了。
我已经尝试将文件分解为与密钥大小相关的部分,但这似乎并不重要。我尝试了一个大小为 2048 的字节数组以及一个大小为 294 的字节数组,认为这可能是特殊的边界,但没有运气。我可以看到文件的某些部分已正确解密,但部分完全是胡言乱语。
是否不可能分块解密文件?如果有办法,那怎么办?
这是我的解密功能/我尝试部分解密。
private Path outFile;
private void decryptFile(FileInputStream fis, byte[] initVector, byte[] aesKey, long used) {
//Assume used = 0 for this function.
byte[] chunks = new byte[2048]; //If this number is greater than or equal to the size of the file then we are good.
try {
if (outFile.toFile().exists())
outFile.toFile().delete();
outFile.toFile().createNewFile();
FileOutputStream fos = new FileOutputStream(outFile.toFile());
OutputStreamWriter out = new OutputStreamWriter(fos);
IvParameterSpec spec = new IvParameterSpec(Arrays.copyOfRange(initVector, 0, 16));
SecretKeySpec key = new SecretKeySpec(aesKey, "AES");
Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key, spec);
int x;
while ((x = fis.read(chunks, 0, chunks.length)) != -1) {
byte[] dec = cipher.doFinal(Arrays.copyOfRange(chunks, 0, x));
out.append(new String(dec));
}
out.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
LOG.error(ExceptionUtils.getStackTrace(e));
}
}