我需要提高以下方法的性能:
private byte[] decrypt(final byte[] encrypted, final Key key) throws ... {
this.cipher.init(Cipher.DECRYPT_MODE, key);
return this.cipher.doFinal(encrypted);
}
The cipher
对象(“AES/ECB/NoPadding”)在构造函数中初始化,以便可以重用。欧洲央行自使用以来encrypted
数组将始终仅包含 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
}
The Cipher.init()
占用了大部分时间decrypt
方法,因为数据太小了。 IE。超过 1200 万次调用,Cipher.init()
平均需要 3 微秒,而Cipher.doFinal()
平均耗时
- 什么需要这么长时间
Cipher.init()
?
- 有什么办法可以只使用 Java 来加速这段代码吗?例如,利用这样的事实,我将始终只解密单个数据块?
- 使用 C/C++ 实现并使用 JNI 调用它会更快吗?如果是这样,有没有成熟的图书馆?
我使用 JDK 1.8.0_73 并且我的处理器支持 AES-NI。
为什么 Cipher.init() 需要这么长时间?
在初始化期间,用户提供的密钥数据被扩展为加密和解密例程使用的会话密钥。
有什么办法可以只使用 Java 来加速这段代码吗?例如,利用这样的事实,我将始终只解密单个数据块?
是的,但这需要重写 AES 算法的基本部分。您可以在 JDK 源中找到它AES加密.java http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/0f6de62683a2/src/share/classes/com/sun/crypto/provider/AESCrypt.java.
或者,您可以存储预初始化密码列表而不是密钥。
使用 C/C++ 实现并使用 JNI 调用它会更快吗?如果是这样,有没有成熟的图书馆?
最有可能的是,是的。libcrypto
这是 OpenSSL 的一部分,会有所帮助。这是一个例子 https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)