使用Java有效地加密文件:AES加密

6

我正在开发一个应用程序,需要对一些小文件(小于1MB)和大文件(约500MB)进行加密。
有什么方法可以高效地对这些文件进行加密,并将加密后的版本保存在磁盘的某个位置呢?
如果花费了一定时间,能否显示加密进度?


您需要多少安全性?通常来说,加密越弱,加密速度越快,反之亦然。 - Sean Dawson
1
你可以使用 BouncyCastle API。 - Bhavik Ambani
@NoxHarmonium:我该如何衡量它?;-) 我需要文件尽可能安全。我不在乎加密速度有多慢,我只想让它以最大速率运行。(我的意思是使用java.iojava.nio进行文件复制之类的操作) - Ariyan
1
进度如何?像 ProgressMonitorInputStream 这样的吗? - President James K. Polk
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添加到密码文本的开头;在解密时,您需要解析出来以初始化密码。

长期而言,更好的解决方案是使用实现加密消息语法(Cryptographic Message Syntax)的库,这是S/MIME的基础。它记录有关可用于解密的算法和密钥的元数据。

如果您的提供商支持,我还建议使用GCM或CCM等AEAD模式。 (SunJCE不支持这些模式。)这些模式将验证文件是否已正确解密并且未被损坏。


@owlstead 我知道现在有GCM的API,而且预计SunJCE会提供它,但是当我去查看时,我在文档中找不到它的提及。您是否知道Oracle是否有任何承诺通过包含的JCE提供程序来提供它? - erickson
1
抱歉,可能我在那里使用了非标准的构建路径。从源代码来看:“Java SE已经在JDK 7中定义了AEAD/GCM接口。在JDK 8中,JCA/JCE提供程序将实现这些AEAD/GCM接口。如果当前的PKCS11标准支持,我们还可能添加一些额外的PKCS11机制。” - Maarten Bodewes
当然,Bouncy Castle API 包含执行 GCM 模式的实现。在结束斯坦福大学加密课程后,我会尝试将其构建到提供程序中。 - Maarten Bodewes

2
正如Bhavik在上面提到的,BouncyCastle是一个不错的选择,它很轻量级且成熟。你可以控制一次读写多少数据来看加密的进展情况。你可以从文件中读取字节,对它们进行加密,然后将结果写回到另一个文件中。
这个问题中提到了一个例子: 如何使用BouncyCastle PGP加密字符串/流而不是从文件开始

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接