Java:去掉'Cipher.init()`开销

Java:去掉'Cipher.init()`开销,java,performance,encryption,aes,Java,Performance,Encryption,Aes,我需要提高以下方法的性能: private byte[] decrypt(final byte[] encrypted, final Key key) throws ... { this.cipher.init(Cipher.DECRYPT_MODE, key); return this.cipher.doFinal(encrypted); } cipher对象(“AES/ECB/NoPadding”)在构造函数中初始化,以便可以重用。使用ECB是因为加密的数组始终只包含16字

我需要提高以下方法的性能:

private byte[] decrypt(final byte[] encrypted, final Key key) throws ... {
    this.cipher.init(Cipher.DECRYPT_MODE, key);
    return this.cipher.doFinal(encrypted);
}
cipher
对象(“AES/ECB/NoPadding”)在构造函数中初始化,以便可以重用。使用ECB是因为
加密的
数组始终只包含16字节的数据(即1个数据块)。使用128位密钥

此方法被调用数百万次以解密16字节块,每次使用不同的密钥。例如,该方法的调用方式如下:

final List<Key> keys = List with millions of keys
final byte[] data = new byte[] { ... 16 bytes of data go here ...}

for (final Key key : keys) {
    final byte[] encrypted = decrypt(data, key);

    // Do something with encrypted
}
final List keys=包含数百万个键的列表
最终字节[]数据=新字节[]{…16字节的数据放在这里…}
用于(最终关键点:关键点){
最终字节[]加密=解密(数据、密钥);
//用加密软件做些什么
}
Cipher.init()
占用了
decrypt
方法的大部分时间,因为数据太小了。也就是说,调用次数超过1200万次,
Cipher.init()
平均需要3微秒,而
Cipher.doFinal()
平均需要<0.5微秒

  • 什么东西在
    Cipher.init()中花费了这么长时间
  • 有没有办法只使用Java来加速这段代码?例如,利用我总是只解密一个数据块的事实
  • 使用C/C++实现并使用JNI调用它会更快吗?如果有,是否有完善的图书馆
我使用JDK1.8.0_73,我的处理器支持AES-NI

Cipher.init()中有什么需要这么长时间的

在初始化期间,用户提供的密钥数据被扩展为加密和解密例程使用的会话密钥

有没有办法只使用Java来加速这段代码?例如,利用我总是只解密一个数据块的事实

是的,但这需要重写AES算法的基本部分。您可以在中的JDK源代码中找到它

或者,您可以存储预初始化密码的列表,而不是密钥

使用C/C++实现并使用JNI调用它会更快吗?如果有,是否有完善的图书馆


很可能是的
libcrypto
是OpenSSL的一部分,它会有所帮助

潜在的钥匙总是一样的吗?换句话说,您会在每个16字节块上运行相同的键列表吗?或者每个16字节块都有自己的密钥列表吗?密钥设置需要一段时间。我不认为单用Java就可以加快速度。@Pace:键会改变,但不会经常改变。你在考虑存储初始化的
密码
对象吗?@Augustin是的,这是我的想法。只需在最后调用
Cipher.init()
(在构造函数中)一次(在我的用例中),存储预初始化的
密码
对象会使速度提高10倍左右。谢谢