我是Java的加密/压缩新手,我正在开发一个测试项目,其目标是通过Java中的缓冲输入压缩然后加密文件。在任何时候都不应该以非加密格式将文件存储在磁盘上,因此我想仅在缓冲区上进行压缩和加密,直到文件完全写入。
所以进展如下:将部分文件读入内存(缓冲区,1024字节) - >压缩(~32字节) - >加密 - >输出到磁盘 - >重复,直到写完整个文件
我面临的问题是,一旦我执行反向操作以读回压缩/加密文件,只有部分数据存在。
为了实现我的目标,我一直在将Inflater / Deflater类和带有AES 256加密的分组密码结合起来。
加密设置:
byte[] randomSalt = new byte[8];
SecureRandom secRand = new SecureRandom();
secRand.nextBytes(randomSalt);
String randomPassword = new BigInteger(130, secRand).toString(32);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(randomPassword.toCharArray(), randomSalt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
获取输入/写入输出:
BufferedInputStream bufferedInput = new BufferedInputStream(
new FileInputStream("file.txt"));
BufferedOutputStream bufferedOutput = new BufferedOutputStream(
new FileOutputStream("encrypted file"));
byte[] buffer = new byte[1024];
try {
while (bufferedInput.read(buffer) != -1) {
byte[] encryptedBuffer = cipher.doFinal(compress(buffer));
bufferedOutput.write(encryptedBuffer);
bufferedOutput.flush();
}
} catch (Exception e) {
//snip
} finally {
bufferedInput.close();
bufferedOutput.close();
}
压缩方法:
public static byte[] compress(byte[] data) throws IOException{
Deflater deflater = new Deflater();
deflater.setInput(data);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
deflater.finish();
byte[] buffer = new byte[1024];
while(!deflater.finished()){
int count = deflater.deflate(buffer);
outputStream.write(buffer, 0, count);
}
outputStream.close();
return outputStream.toByteArray();
}
我可以做些什么来一次压缩和加密1KB的文件,并在执行反向操作时完整地恢复文件?