当前位置: 首页 > 面试题库 >

默认启用AES-NI内部函数吗?

萧树
2023-03-14
问题内容

Oracle关于AES-NI关于Java 8的说法如下:

添加了硬件内在函数以使用高级加密标准(AES)。UseAES和UseAESIntrinsics标志可用于为Intel硬件启用基于硬件的AES内在函数。硬件必须是2010或更新的Westmere硬件。例如,要启用硬件AES,请使用以下标志:

-XX:+UseAES -XX:+UseAESIntrinsics

要禁用硬件AES,请使用以下标志:

-XX:-UseAES -XX:-UseAESIntrinsics

但这并不表示默认情况下是否启用了AES内部函数(对于支持它的处理器)。因此问题很简单:如果处理器支持AES-NI,是否使用AES内部函数?

额外的问题:有什么方法可以测试是否正在使用AES-NI?我猜您可以根据性能进行猜测,但这并不是最佳或确定的测试方法。

对于不熟悉AES-NI内在函数的读者:它使用AES-
NI指令集将字节代码替换为预编译的机器代码。JVM会发生这种情况,因此它不会显示在Java运行时的API或字节码中。


问题答案:

该标志的默认值为true,如果检测失败,它将设置为false,因此您可以简单地使用+ PrintFlagsFinal来查看是否已使用它:

我的 没有 AES-NI的笔记本电脑:

C:\>"C:\Program Files\Java\jdk1.7.0_51\bin\java" -XX:+PrintFlagsFinal -version | find "UseAES"
     bool UseAES                                    = false           {product}
     bool UseAESIntrinsics                          = false           {product}
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

带有 AES-NI的桌面相同:

C:\>"C:\Program Files\Java\jdk7\bin\java" -XX:+PrintFlagsFinal -version | find "AES"
     bool UseAES                                    = true            {product}
     bool UseAESIntrinsics                          = true            {product}

java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

C:\>"C:\Program Files (x86)\Java\jre7\bin\java" -XX:+PrintFlagsFinal -version | find "AES"
     bool UseAES                                    = true            {product}
     bool UseAESIntrinsics                          = true            {product}

java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) Client VM (build 24.51-b03, mixed mode, sharing)

因此,它适用于使用最新Java
7的x64和i686(WOW64)。该功能是通过https://bugs.openjdk.java.net/browse/JDK-7184394引入的,并反向移植到7u40和7u45。

重要:AES-NI可能仅在 服务器VM 上可用。

在提交错误报告后,Oracle承认了这一点。当他们在Java
8的特性列表中创建了该重要信息时,这些信息就丢失了(后来也移植到了7)。通过-serverjavajavaw命令行上提供选项,可以显式选择服务器VM



 类似资料:
  • Oracle对Java8的AES-NI有这样的看法: 为了使用高级加密标准(AES),增加了硬件内部信息。UseAES和UseAESIntrinsics标志可用于为Intel硬件启用基于硬件的AES intrinsics。硬件必须是2010年或更新的Westmere硬件。例如,要启用硬件AES,请使用以下标志: 要禁用硬件AES,请使用以下标志: 加分问题:有没有办法测试是否正在使用AES-NI?

  • 的复制构造函数和赋值操作符的情况下,便编译器会为我们生成默认的复制构造函数和赋值操作符,以内存复制的形式完成对象的复制。虽然这种机制可以为我们节省很多编写复制构造函数和赋值操作符的时间,但是在某些情况下,比如我们不希望对象被复制,这种机制却是多此一举。) 关于类的“禁止复制”,现在可以使用delete关键字完美地直接表达: class X { // … X& operator=(c

  • 删除函数的函数可以不进行实现,默认函数就则不同:编译器会创建函数实现,通常都是“默认”实现。当然,这些函数可以直接使用(它们都会自动生成):默认构造函数,析构函数,拷贝构造函数,移动构造函数,拷贝赋值操作符和移动赋值操作符。 为什么要这样做呢?这里列出一些原因: 改变函数的可访问性——编译器生成的默认函数通常都是声明为public(如果想让其为protected或private成员,必须自己实现)

  • 对于一些函数,你可能希望它的一些参数是 可选 的,如果用户不想要为这些参数提供值的话,这些参数就使用默认值。这个功能借助于默认参数值完成。你可以在函数定义的形参名后加上赋值运算符(=)和默认值,从而给形参指定默认参数值。 注意,默认参数值应该是一个参数。更加准确的说,默认参数值应该是不可变的——这会在后面的章节中做详细解释。从现在开始,请记住这一点。 使用默认参数值 例7.5 使用默认参数值 #!

  • 这里是Python NewView。请容忍我。 写了一些很好的代码后,有一件事困扰着我,那就是我找不到一种方法来告诉eclipse这个文件/函数是我的项目(测试)的起点。 我在调试过程中进入代码,并最终在代码深处的某个文件中结束。然后如果我想再次运行它,我会转到包含开始文件的选项卡并再次运行它。能够为python项目指定一个“主”函数就像我们在C中为例如Python项目指定的那样是件好事。 这样的

  • 问题内容: 我对PHP函数的默认值感到困惑。说我有一个这样的功能: 如果我想为$ x使用默认参数并为$ y设置不同的参数怎么办? 我一直在尝试不同的方法,但我变得更加困惑。例如,我尝试了以下两种方法: 但是这两个都不会为$ x产生适当的默认参数。我也试图通过变量名来设置它。 我完全希望这样的事情能奏效。但这根本不符合我的预期。似乎不管我做什么,每次调用该函数时,无论如何我都必须最终键入默认参数。而