Java AES/CBC/PKCS5Padding 与未加密相比的流加密性能

Java AES/CBC/PKCS5Padding stream encryption performance compared to no encryption

我正在使用标准技术,即使用 RSA key/pair,其 public 密钥加密 16 字节随机密钥,该密钥使用 AES/CBC/PKCS5Padding 加密我的数据。 我正在使用 bouncy castle 来满足我的需要我需要加密通常大数据流 (512MB+)。 在用于了解加密开销的 运行 性能测试中,我发现加密比未加密数据贵将近 30-40%。 这是预期的吗?

示例代码

public InputStream encryptStream(InputStream streamToEncrypt, byte[] key, byte[] iv, byte[] encryptedKey // 256 bytes) {

        final Cipher cipher = getCipher(Cipher.ENCRYPT_MODE, key, iv);
        byte[] civ = cipher.getIV();
         ...
        ByteArrayInputStream ivEncryptedKeyStream = new ByteArrayInputStream(ivEncryptedKeyArray);
        CipherInputStream encrypted = new CipherInputStream(streamToEncrypt, cipher);

        return new SequenceInputStream(ivEncryptedKeyStream, encrypted);
    }

别处

 InputStream encryptedStream = ...encryptStream(plainStream, key, iv, encKey);
 IOUtils.copyLarge(encryptedStream, outputStream);

我玩过 java 服务器参数;确认 AES-NI 指令集已打开等。 只是想知道加密大流时我应该期望的开销是多少?

编辑:更正了我正在使用 bouncycastle 仅用于密钥对生成的信息。对于使用 SunJCE 作为安全提供程序的 AES 加密。

将 Bouncy Castle 用于 Oracle Java API 中已有的所有内容的想法让我难以理解。不会为 Bouncy 启用 AES-NI,因为 Bouncy 是一个 纯软件 库。 Java 不会用硬件指令神奇地替换 AESFastEngine。如果你想要速度,就使用 Oracle 实现。

至于开销:是的,应该预料到开销。与其他计算相比,百分比有多大当然取决于机器和其他计算的性能。不过 40% 可能是一个合理的预期。

备注:

  • 最新的 Java 版本也使用 CPU 指令进行 BigInteger 操作,因此这也可能加快 RSA 操作;
  • 使用 PKCS#1 填充 Java and/or AES CBC 使您的密文容易受到填充 oracle 攻击(如果这些适用,例如在传输协议中);
  • 请确保您使用足够大的测试集,JIT 编译和优化可能会启动得相对较晚。