web-dev-qa-db-ja.com

AES-NI組み込みはデフォルトで有効になっていますか?

Oracleはこれについて、AES-NIに関してJava 8について述べています。

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で発生するため、JavaランタイムまたはバイトコードのAPIには表示されません。

31
Maarten Bodewes

フラグのデフォルトは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)

デスクトップでも同じwithAES-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は、server VMでのみ使用できる場合があります。

これは、バグレポートが提出された後 オラクルによって承認されました 。この重要な情報は、導入されたJava 8の機能リストを作成したときに欠落していました(後で7にもバックポートされました)。サーバーVMは、Javaまたはjavawコマンドラインで-serverオプションを指定することで明示的に選択できます。

32
eckes

コメントできません(愚かSOルールは50クレジットを超える必要があります!) openjdkからのこのメールスレッド は、すべてのAES組み込み関数がデフォルトで有効になっていることを示しています。 Oracleコアのどの程度かはわかりませんVMコードはopenjdkと共有します。スレッド全体を読んだ場合、32ビットVMの課題についても議論されます。これはおそらく2番目のテストの問題を説明しています実行します。

  • テストについて(申し訳ありませんが、コメントできません)、CPUの違いが大きな違いになると思いませんか? Core i7はクアッドコアであり、一般的にクロック速度が優れています。それは違いを生んだと思いませんか? 21秒(コアi5、32ビットVM、AES-NIオフ)から8秒(コアi7、64ビットVM、AES-NIオフ)へのシフトは、i5とi7の違いだと思います。
  • 8秒から3秒への改善は、7倍ではありませんが、確かに「イペ」の価値があります。 :)
  • 検出メカニズムに関して-簡単な方法はないようです。フラグを有効にし、AESサポートが見つからない場合、JVMは「このCPUではAES組み込み関数を使用できません」という警告をスローします- このバグレポートに従って
4
user30622