Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于Java中文件加密性能的建议_Java_Performance_Encryption - Fatal编程技术网

关于Java中文件加密性能的建议

关于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;

我正在做一些与文件加密相关的工作。我能够加密/解密文件,但面临一个重大性能问题。当我简单地读/写一个700MB大小的视频文件时,我的代码执行速度大约为27-28MB/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

加密只是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无论如何都不提供任何真正的加密,尤其是在这种大小的文件上。