3

所以我有这些大文件(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));
    }
  }
4

1 回答 1

4

考虑使用Cipher#update(byte[], int, int, byte[], int)而不是doFinal()多部分操作。这将为您处理零件边界。

doFinal(byte[] output, int outputOffset)调用该方法可以获取解密数据的最后一部分。

于 2013-09-06T07:39:45.787 回答