Встроенные функции AES-NI включены по умолчанию?

Oracle говорит об Java 8 в отношении AES-NI:

Аппаратные характеристики были добавлены для использования Advanced Encryption Standard (AES). Флаги UseAES и UseAESIntrinsics доступны для включения аппаратных встроенных функций AES для оборудования Intel. Аппаратное обеспечение должно быть 2010 или более нового оборудования Westmere. Например, чтобы включить аппаратную AES, используйте следующие флаги:

-XX:+UseAES -XX:+UseAESIntrinsics

Для отключения аппаратного AES используйте следующие флаги:

-XX:-UseAES -XX:-UseAESIntrinsics

Но это не указывает, включены ли встроенные функции AES по умолчанию (для процессоров, которые его поддерживают). Поэтому вопрос прост: если процессор поддерживает AES-NI, используются ли встроенные функции AES?

Бонусный вопрос: есть ли способ проверить, используется ли AES-NI? Я думаю, что вы можете догадаться, основываясь на производительности, но это не оптимальный или надежный способ тестирования.


Для читателей, которые не знакомы с внутренними особенностями AES-NI: он заменяет байтовый код предварительно скомпилированным машинным кодом, используя набор инструкций AES-NI. Это происходит с помощью JVM, поэтому оно не отображается в API среды выполнения Java или байт-кода.

2 ответа

Решение

По умолчанию флаг имеет значение 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)

Таким образом, он работает как для x64, так и для i686 (WOW64) с недавней Java 7. Эта функция была представлена ​​с https://bugs.openjdk.java.net/browse/JDK-7184394 и перенесена на 7u40 и 7u45.


Важно: AES-NI может быть доступен только на виртуальной машине сервера.

Это было подтверждено Oracle после подачи сообщения об ошибке. Эта жизненно важная информация отсутствовала, когда они создавали список возможностей Java 8, где он был представлен (позже он также был перенесен на 7). Виртуальная машина сервера может быть явно выбрана путем предоставления -server вариант на java или же javaw командная строка.

Не могу комментировать (глупые правила SO требуют более 50 кредитов!). В этом сообщении от openjdk говорится, что все встроенные функции AES включены по умолчанию. Хотя я не уверен, сколько кода ядра VM Oracle совместно использует openjdk. Если вы прочитаете всю ветку, они также обсудят проблемы на 32-битных виртуальных машинах, что, вероятно, объясняет вашу проблему во втором тестовом прогоне.

  • Что касается вашего теста (извините, не могу комментировать), вы не думаете, что различия в процессорах имеют большое значение? Core i7 являются четырехъядерными и имеют лучшую тактовую частоту в целом. Разве это не имело бы значения? Я полагаю, что переход от 21 с (ядро i5, 32-битный ВМ, AES-NI выключен) к 8 с (ядро i7, 64-битный ВМ, AES-NI выключен) - это разница между i5 и i7.
  • Улучшение с 8 до 3, хотя и не в 7 раз, действительно стоит "Yipes"!:)
  • Что касается механизма обнаружения - кажется, нет прямого пути. JVM выдает предупреждение "Встроенные функции AES недоступны на этом процессоре", если вы включили флаги, и если он не может найти поддержку AES - согласно этому отчету об ошибке.
Другие вопросы по тегам