6

我正在开发一个应该加密一些小(小于 1MB)和大(大约 500MB)文件的应用程序。
如何加密文件并将加密版本有效地保存在磁盘上的某个位置(即快速)?
如果需要时间,我可以进行加密吗?

4

2 回答 2

6

假设你有一个 AES 密钥和一些输出流,下面是你如何向流中添加加密装饰器的方法。

Cipher enc = Cipher.getInstance("AES/CBC/PKCS5Padding");
enc.init(Cipher.ENCRYPT_MODE, key);
AlgorithmParameters params = enc.getParameters();
IvParameterSpec iv = params.getParameterSpec(IvParameterSpec.class);
out.write(iv.getIV());
out = new CipherOutputStream(enc, out); 

这会将 IV 添加到密文的开头;解密时,您需要将其解析出来以初始化密码。

从长远来看,更好的解决方案是使用实现加密消息语法的库,这是 S/MIME 的基础。这记录了有关可用于解密的算法和密钥的元数据。

如果您的提供商实现它,我还会推荐像 GCM 或 CCM 这样的 AEAD 模式。(SunJCE 没有。)这些将验证文件是否正确解密,并且没有损坏。

于 2012-08-12T06:53:39.500 回答
2

正如 Bhavik 上面提到的,BouncyCastle 将是一个不错的选择,它轻巧且成熟。您绝对可以看到加密的进度,因为您可以控制一次读取和写入的数量。您可以从文件中读取字节,对其进行加密并写回管道中的另一个文件。

这个问题中提到了一个例子: How to encrypt a string/stream with bouncycastle pgp without starting with a file

于 2012-08-12T06:55:19.813 回答