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

时间:2016-07-23 12:12:24

标签: java security encryption aes

使用标准技术使用RSA密钥/对,其公钥加密16字节随机密钥,使用AES / CBC / PKCS5Padding加密我的数据。 我正在使用充气城堡我需要加密通常大数据流(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服务器args;确认AES-NI指令集已打开等。 只是想知道加密大流时我应该期待什么开销?

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

1 个答案:

答案 0 :(得分:3)

将Bouncy Castle用于Oracle Java API中的所有内容的想法让我感到震惊。由于Bouncy只是一个软件库,因此不会为Bouncy启用AES-NI。 Java不会用硬件指令神奇地替换AESFastEngine。如果你想拥有速度,只需使用Oracle实现。

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

注意:

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