关于Java中文件加密性能的建议
我正在做一些与文件加密相关的工作。我能够加密/解密文件,但面临一个重大性能问题。当我简单地读/写一个700MB大小的视频文件时,我的代码执行速度大约为27-28MB/s。但当我执行加密时(我目前使用的是PBEWithMD5AndDES,我稍后会更改),代码显示速度为9 MB/s。 请告知我在哪里可以改进 代码段:关于Java中文件加密性能的建议,java,performance,encryption,Java,Performance,Encryption,我正在做一些与文件加密相关的工作。我能够加密/解密文件,但面临一个重大性能问题。当我简单地读/写一个700MB大小的视频文件时,我的代码执行速度大约为27-28MB/s。但当我执行加密时(我目前使用的是PBEWithMD5AndDES,我稍后会更改),代码显示速度为9 MB/s。 请告知我在哪里可以改进 代码段: int c = 0, BUF_SIZE = 8192; byte[] b = new byte[BUF_SIZE]; FileInputStream fis;
int c = 0, BUF_SIZE = 8192;
byte[] b = new byte[BUF_SIZE];
FileInputStream fis;
DataInputStream dis;
FileOutputStream fos;
DataOutputStream dos;
CipherOutputStream cos;
try {
// Create PBE parameter set
pbeParamSpec = new PBEParameterSpec(salt, iterationCount);
// Create PBE Cipher
Cipher pbeCipher = Cipher.getInstance(algorithm);
// get key
key = generateKeyFromPassword(password);
// Initialize PBE Cipher with key and parameters
pbeCipher.init(Cipher.ENCRYPT_MODE, key, pbeParamSpec);
fis = new FileInputStream(inFile);
dis = new DataInputStream(fis);
fos = new FileOutputStream(outFile);
dos = new DataOutputStream(fos);
cos = new CipherOutputStream(fos, pbeCipher);
while ((c = dis.read(b)) > 0) {
cos.write(b);
//dos.write(b);
}
fis.close();
dis.close();
//dos.close();
cos.close();
} catch (Exception e) {
e.printStackTrace();
}
未加密的统计信息:速度约为27.97 MB/s
精确时间=25.02秒
文件大小=700 MB
具有加密功能的统计信息:
速度约为9.69 MB/s
精确时间=72.171秒
文件大小=700 MB
加密只是CPU密集型的。也许您可以找到一个更高效的实现,并将运行时间减少两个百分点,或者使用一个专用的硬件引擎,以相当多的美元获得更好的性能
不过,我要确保的第一件事是,您的应用程序能够处理这样一个事实,即这只需要一段时间。这意味着将加密放入后台操作,在使用之前准备内容,以及类似的设计考虑。尝试用缓冲输入流包装数据输入流,以供初学者使用。
另外,还可以查看java中不同算法的性能比较。AES确实比DES产生更快的结果。首先:如果可能,不要自己做。加密非常(非常!)容易出错,导致结果不安全。如果可能,使用外部组件或库尽可能多地执行加密工作 第二,如果你打算像现在这样自己做,不要使用DES。DES不再是一个足够强大的密码。三重DES是可以的,但您真正想要使用的是AES。它被认为是安全的,现代CPU在设计过程中一直牢记在心,您可以选择密钥长度来平衡安全性和性能,现代CPU具有AES硬件加速功能(AES-NI)。(我不知道Java是否使用此功能,但如果不使用,将来肯定会开始使用,而三重DES使用此功能的可能性为零。)
第三,一次读写一个字节。尽管加密在任何情况下都将是CPU密集型的,但按目前的方式进行加密将比必要的速度慢。通过4kB左右的
字节[]
进行读写应该会有更好的性能。您是否尝试过其他方法?在我看到的所有使用Java加密的地方,都使用它来代替内置API。您是否尝试过不同的块密码,例如AES?您有什么类型的CPU?正确完成AES加密后,即使在较旧的硬件上,AES加密也应超过30MB/s。我使用的是CPU:intel i3@2.27 GHz OS:Ubuntu 10.10较新的intel I处理器具有针对此类任务进行优化的加密指令集。也许这会给你一个巨大的速度提升@Thomas My i3没有AES指令,但即使没有AES指令,我也希望在他的comp上AES的每核速度>50MB/s。即使使用加密,10MB/s的速度也非常慢。使用多线程和AES my i3 2.6 GHz管理200MB/s。但我不熟悉DES的性能特点。@ThinkStiple“剃掉几%”对我来说听起来像是一句地道的英语。无需修复。@CodeInChaos AES比DES快一点(而且更安全),现代CPU对AES指令有明确的硬件支持,与普通硬件相比,它提供了巨大的加速。因此,毫不奇怪,这里的速度是200MB/s或更高——实际上它相当低,i3不支持AES-NI吗?至少我的i3不支持AES-NI。我知道AES比TripleDES快得多,但我不知道它与普通DES相比如何。好吧,区别在于DES的速度是3DES的三倍,我不知道AES是否可以匹配(可能匹配),但DES无论如何都不提供任何真正的加密,尤其是在这种大小的文件上。