建议Java中的文件加密性能

时间:2012-01-29 10:31:40

标签: java performance encryption

我正在做一些与文件加密相关的工作。我能够加密/解密文件,但面临一个主要的性能问题。当我只读取/写入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

4 个答案:

答案 0 :(得分:4)

首先:如果可能的话,不要自己做。加密非常(非常!)容易陷入混乱,导致结果不安全。如果可能的话,使用外部组件或库来执行尽可能多的加密工作。

其次,如果你现在要自己做,不要使用DES。 DES不再是一个足够强大的密码。 Triple-DES是可以的,但你真正想要使用的是AES。在设计过程中,它被视为安全,现代的CPU,您可以选择密钥长度来平衡安全性和性能,现代CPU具有AES(AES-NI)的硬件加速。 (我不知道Java是否使用了这个,但如果它没有,它肯定会在将来开始,而Triple-DES的机会是零。)

第三,您一次只读取和写入一个字节。虽然加密在任何情况下都会占用大量CPU资源,但目前这样做会比必要的慢。通过大约4kB左右的byte[]进行读写可以看到更好的表现。

答案 1 :(得分:2)

尝试使用缓冲输入流包装数据输入流以供初学者使用。 另请检查此link以获取java中不同算法的性能比较。 AES确实会产生比DES快得多的结果。

答案 2 :(得分:0)

加密只是CPU密集型。也许你可以找到一个更有效的实现,并减少运行时间的几个百分点,或者使用专用的硬件引擎,并以相当多的价格获得更好的性能。

我要确保的第一件事是你的应用程序能够应对这一事实需要一段时间。这意味着将加密应用于后台操作,在使用之前准备内容以及类似的设计考虑因素。

答案 3 :(得分:0)

您是否尝试过BouncyCastle作为替代方案?在我看过的所有地方都使用过Java密码术,它被用来代替内置的API。