【问题标题】:Java - modify file in partsJava - 部分修改文件
【发布时间】:2012-12-24 14:27:23
【问题描述】:

我正在开发 AES 256 位文件加密工具。它现在的工作方式是:

将整个文件读入字符串, 加密字符串, 删除旧文件,然后将加密后的 String 输出到旧的 File 对象中。

这适用于小文件,但如果您要尝试加密大文件,例如比堆空间 Java 也可以访问的大文件,您会收到错误消息。长话短说,我怎样才能一次读取一 MB 的文件,作为字符串,加密该字符串,然后将该 MB 写入临时文件?这将允许对大文件进行加密。

【问题讨论】:

  • 这从根本上来说很棘手。 CBC 使这成为不可能,而 ECB 并不安全。 en.wikipedia.org/wiki/Disk_encryption_theory
  • 最好将加密后的结果写入一个新建文件,如果新文件创建成功则删除原文件并将新文件重命名为原文件。这样,如果写入新文件失败,您可以保证不会丢失原始文件。
  • 这是一个更好的主意,我不这样做。但主要问题是如何将文件读入部分字符串
  • @DonutAvenger:您可以映射它,而不是将文件读入内存。不过,这意味着使用 nio。

标签: java file io aes


【解决方案1】:

不需要临时文件。只需使用文件流(FileInputStream 和 FileOutputStream)。流式 I/O 正是为处理块中的长文件而创建的。如果你想读/写字符串,你可以使用 FileReader/Writer。 There is an example:

  public void decrypt(File in, File out) throws IOException, InvalidKeyException {
    aesCipher.init(Cipher.DECRYPT_MODE, aeskeySpec);
    CipherInputStream is = new CipherInputStream(new FileInputStream(in), aesCipher);
    FileOutputStream os = new FileOutputStream(out);

    int i;
    byte[] b = new byte[1024];
    while((i=is.read(b))!=-1) {
            os.write(b, 0, i);
    }

【讨论】:

  • 我最终使用 FileReader 读取字符,然后将它们添加到字符串中。从那里我加密了该字符串并将其写回。虽然看起来效率不高。我会尝试更深入地研究您的示例。
  • 连接内存中的所有内容违背了流式处理(块内处理)的想法。你看到 in.read(block) 和 os.write(block) 交错了吗?您在哪里看到字符串/块的连接?
  • 请确保您使用正确的加密模式,并且不要忘记包含 IV。此外,不要忘记CipherInputStream 具有忽略填充异常的不幸副作用。某种加密校验和(MAC 或 HMAC)也可能是个好主意。
猜你喜欢
  • 2011-12-02
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
相关资源
最近更新 更多