压缩然后通过Java

时间:2017-12-03 01:47:46

标签: java encryption compression

我是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的文件,并在执行反向操作时完整地恢复文件?

0 个答案:

没有答案