我需要提高以下方法的性能:
我需要提高以下方法的性能:
private byte[] decrypt(final byte[] encrypted, final Key key) throws ... {
this.cipher.init(Cipher.DECRYPT_MODE, key);
return this.cipher.doFinal(encrypted);
}
在构造函数中初始化了“AES/ECB/NoPadding”加密方式的对象,以便可以重复使用。由于encrypted
数组始终只包含16个字节的数据(即1个数据块),因此使用ECB模式。使用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
}
Cipher.init()
方法在decrypt
方法中占据了大部分时间,因为数据非常小。也就是说,在超过1200万次调用中,Cipher.init()
的平均耗时为3微秒,而Cipher.doFinal()
的平均耗时小于0.5微秒。
Cipher.init()
方法需要这么长的时间是由于什么原因?- 有没有 Java 方式来加速此部分代码?比如说利用每次只解密单个数据块这个事实?
- 使用 C/C++ 实现并通过 JNI 调用会更快吗?如果是,是否有任何成熟的库可用?
我使用 JDK 1.8.0_73,我的处理器支持 AES-NI。
Cipher.init()
一次即可。 - user924