Oracle a ceci à dire sur Java 8 en ce qui concerne AES-NI:
Des éléments intrinsèques matériels ont été ajoutés pour utiliser Advanced Encryption Standard (AES). Les indicateurs UseAES et UseAESIntrinsics sont disponibles pour activer les intrinsèques AES basés sur le matériel pour le matériel Intel. Le matériel doit être du matériel Westmere 2010 ou plus récent. Par exemple, pour activer le matériel AES, utilisez les indicateurs suivants:
-XX:+UseAES -XX:+UseAESIntrinsics
Pour désactiver le matériel AES, utilisez les drapeaux suivants:
-XX:-UseAES -XX:-UseAESIntrinsics
Mais cela n'indique pas si les intrinsèques AES sont activés par défaut (pour les processeurs qui le prennent en charge). La question est donc simple: si le processeur prend en charge AES-NI, les intrinsèques AES sont-ils utilisés?
Question bonus: existe-t-il un moyen de tester si AES-NI est utilisé? Je suppose que vous pouvez deviner en fonction des performances, mais ce n'est pas un moyen de test optimal ou sûr.
Pour les lecteurs qui ne sont pas familiers avec les intrinsèques AES-NI: il remplace le code octet par du code machine précompilé, en utilisant le jeu d'instructions AES-NI. Cela se produit par la JVM, donc il n'apparaît pas dans l'API du runtime ou du bytecode Java.
Le drapeau a une valeur par défaut true et il sera défini sur false si la détection échoue, vous pouvez donc simplement utiliser + PrintFlagsFinal pour voir s'il est utilisé:
Mon ordinateur portable sans 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)
Idem sur le bureau avec 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)
Donc, cela fonctionne à la fois pour x64 et i686 (WOW64) avec la récente Java 7. La fonctionnalité a été introduite avec https://bugs.openjdk.Java.net/browse/JDK-7184394 et rétroporté à 7u40 et 7u45.
Important: AES-NI peut uniquement être disponible sur la machine virtuelle du serveur .
Cela a été reconnu par Oracle après n rapport de bogue a été déposé . Cette information vitale manquait quand ils ont créé la liste des featues de Java 8 où elle a été introduite (elle a ensuite été rétroportée à 7 également). Le serveur VM peut être choisi explicitement en fournissant l'option -server
Sur la ligne de commande Java
ou javaw
.
Impossible de commenter (stupide SO règles de plus de 50 crédits requis!). Ce mailthread de openjdk dit, tous les intrinsèques AES sont activés par défaut. Bien que je sois Je ne sais pas quelle part du noyau Oracle VM partage avec openjdk. Si vous lisez le fil entier, ils discutent également des défis sur les machines virtuelles 32 bits, ce qui explique probablement votre problème avec votre deuxième test courir.