【问题标题】:Advise on file encryption performance in Java关于 Java 文件加密性能的建议
【发布时间】:2012-01-29 19:38:59
【问题描述】:

我正在做一些文件加密相关的工作。我能够加密/解密文件,但面临一个主要的性能问题。当我简单地读/写一个 700 MB 大小的视频文件时,我的代码以大约 27-28 MB/s 的速度执行。但是当我执行加密时(我目前正在使用 PBEWithMD5AndDES,我稍后会更改)代码显示速度为 9 MB/s。 请告知我在哪里可以改进。

代码sn-p:

    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

【问题讨论】:

  • 您是否尝试过其他块密码,例如 AES?
  • 你有什么样的CPU?正确完成后,即使在较旧的硬件上,AES 加密也应超过 30MB/s。
  • 我正在开发 CPU:intel i3 @ 2.27 GHz 操作系统:Ubuntu 10.10
  • 较新的英特尔 i 处理器具有针对此类任务进行了优化的加密指令集。也许这会给你一个巨大的速度提升。 software.intel.com/en-us/articles/…
  • @Thomas 我的 i3 没有 AES 指令,但即使没有它们,我也希望他的计算机上的 AES 的每个核心 >50MB/s。

标签: java performance encryption


【解决方案1】:

首先:如果可能的话,不要自己做。加密非常(非常!)容易以导致结果不安全的方式搞砸。如果可能,请使用外部组件或库来完成尽可能多的加密工作。

其次,如果您要像现在一样自己执行此操作,请不要使用 DES。 DES 不再是足够强大的密码。 Triple-DES 可以,但您真正想要使用的是 AES。它被认为是安全的,在设计过程中牢记现代 CPU,您可以选择密钥长度以平衡安全性与性能,并且现代 CPU 具有 AES (AES-NI) 硬件加速。 (我不知道 Java 是否使用这个,但如果没有,它肯定会在未来开始使用,而 Triple-DES 的可能性为零。)

第三,您一次读取和写入一个字节。虽然加密在任何情况下都将是 CPU 密集型的,但按照您现在的方式进行操作将比必要的速度慢。通过 4kB 左右的byte[] 读写应该会看到更好的性能。

【讨论】:

    【解决方案2】:

    尝试用缓冲输入流包装数据输入流。 还可以查看 link 以比较 java 中不同算法的性能。 AES 确实会产生比 DES 快得多的结果。

    【讨论】:

      【解决方案3】:

      加密只是 CPU 密集型的。也许您可以找到一个更高效的实现并减少几个 % 的运行时间,或者使用专用硬件引擎并花几美元获得更好的性能。

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

      【讨论】:

      • 10MB/s 非常慢,即使使用加密也是如此。使用多线程和 AES,我的 i3 2.6 GHz 管理 200MB/s。但我不熟悉 DES 的性能特点。
      • @thinksteep “削减几个 %”对我来说听起来像是有效的英语。无需修复。
      • @CodeInChaos AES 比 DES 快一点(也更安全),现代 CPU 对 AES 指令有明确的硬件支持,与通用硬件相比,它提供了巨大的加速。所以你得到 200MB/s 或更多也就不足为奇了 - 实际上它相当低,i3 不支持 AES-NI 吗?
      • 至少我的 i3 不支持 AES-NI。而且我知道 AES 比 TripleDES 快得多,但我不知道它与普通 DES 相比如何。
      • 嗯,不同之处在于 DES 的速度是 3DES 的三倍,我不知道 AES 是否可以匹配(可能会)但是 DES 无论如何都没有提供任何真正的加密,尤其是在那种大小的文件。
      【解决方案4】:

      您是否尝试过BouncyCastle 作为替代方案?我在任何地方都看到使用 Java 加密技术,它被用来代替内置 API。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多