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 编译和优化可能会启动得相对较晚。
我正在使用标准技术,即使用 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 编译和优化可能会启动得相对较晚。