AES acceleration for Java

2022-09-02 23:52:54

我想加密/解密大量小(2-10kB)数据。现在性能还可以:在Core2Duo上,我得到大约90 MBytes / s AES256(使用2个线程时)。但我将来可能需要改进它 - 或者至少减少对CPU的影响。

  • 是否可以将专用的AES加密硬件与Java一起使用(使用JCE,或者可能是不同的API)?
  • 如果我得到一个更好的CPU,Java会利用特殊的CPU功能(SSE5?!)吗?
  • 还是有更快的JCE提供商?(我尝试了SunJCE和BouncyCastle - 没有太大的区别。
  • 其他可能性?

答案 1

在执行恰好是AES加密的代码时,JVM本身不会利用特殊的CPU功能:将某些代码识别为AES的实现超出了JIT编译器的能力。要使用特殊硬件(例如 VIA 处理器上的“挂锁”,或较新的英特尔处理器上的 AES-NI 指令),您必须在某个时候通过“本机代码”。

可能,JCE提供商可以为您做到这一点。我不知道有任何现成的JCE提供程序,其中包括针对AES优化的本机代码(有一个名为Apache JuiCE的项目,但它似乎停滞不前,我不知道它的状态)。然而,可以想象SunJCE将在未来的版本中做到这一点(但是由于Oracle收购了Sun以及OpenJDK 7的过度功能,目前尚不清楚下一个Java版本何时发布)。或者,咬紧牙关,自己使用本机代码。本机代码通过JNI调用,对于本机AES代码,一个流行的实现是Brian Gladman的实现。当您使用AES-NI指令获得更大,更新的处理器时,请将该本机代码替换为一些了解这些指令的代码,如英特尔所述

通过使用AES-128而不是AES-256,您应该获得+40%的速度提升。打破AES-128目前超出了人类的技术范围,应该在未来几十年内保持这种状态。你真的需要一个256位的AES密钥吗?


答案 2

以防万一人们遇到这种情况。JAVA 8 现在使用 AES-NI。请参阅:默认情况下启用 AES-NI 内联函数?


推荐