Java的AES加速

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

  • 是否可以使用Java专用AES加密硬件(使用JCE,或者可能是不同的API)?
  • 如果我有更好的CPU,Java会利用特殊的CPUfunction(SSE5?!)吗?
  • 或者有更快的JCE提供商? (我试过SunJCE和BouncyCastle – 没什么大不同。)
  • 其他可能性?

在执行恰好是AES加密的代码时,JVM本身不会利用特殊的CPUfunction:将某些代码识别为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吗?

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

通过将SunPKCS11安全提供程序与mozilla-nss库一起使用,您可以从提高的AES速度中受益。

安装程序描述于

  • 使用英特尔®AES-NI指令改进了使用NSS的Java上的高级加密标准(AES)加密性能
  • 和JavaTM PKCS#11参考指南

一个简单的谷歌搜索将识别一些声称硬件加速Solaris加密框架的 JCE提供商。 我听说盈亏平衡点是4K(在4k以下,在JVM java提供程序中使用它的速度更快)。

我可能会考虑使用NSS实现,它可能会为您的平台进行一些编译器优化(并且您可以在启用它们的情况下从源代码构建); 虽然我自己没有用过它。 硬件和提供商的最大好处可能是密钥可以以支持使用它们的方式存储在硬件中,而不会将它们暴露给操作系统。

更新:我应该提一下, Keyczar源代码有一些有用的见解(在源代码或周围文档的某处)有关减少初始化密码的开销。 它也完全符合您的要求(参见Encrypter),并且似乎实现了异步加密(使用线程池)。

我还建议使用AES-128而不是256.如果代码松散耦合,并且仍然存在多年,AES-128变得过时,我的猜测是更新加密会更容易那时(当硬件将更强大时)比现在尝试通过硬件优化性能。

当然,这是假设松散耦合:D