我正在做一些文件加密相关的工作。我能够加密/解密文件,但面临主要的性能问题。当我简单地读取/写入 700 MB 大小的视频文件时,我的代码的执行速度约为 27-28 MB/s。但是当我执行加密时(我目前正在使用 PBEWithMD5AndDES,我稍后会更改)代码显示速度为 9 MB/s。
请大家指教我哪里可以改进。
代码片段:
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
首先:如果可能的话,不要自己这样做。加密非常(非常!)很容易搞砸,从而导致结果不安全。如果可能的话,请使用外部组件或库来完成尽可能多的加密工作。
其次,如果您像现在一样要自己执行此操作,请不要使用 DES。 DES 不再是一个足够强大的密码。 Triple-DES 可以,但您真正想要使用的是 AES。它被认为是安全的,在设计过程中考虑到了现代 CPU,您可以选择密钥长度来平衡安全性与性能,并且现代 CPU 具有 AES (AES-NI) 硬件加速功能。 (我不知道 Java 是否使用此功能,但如果不使用,将来肯定会开始使用,而 Triple-DES 的可能性为零。)
第三,您一次读取和写入一个字节。虽然加密无论如何都会占用 CPU 资源,但按照目前的方式进行加密会比必要的速度慢。通过 a 进行读取和写入byte[]
4kB 左右应该会看到更好的性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)