Компилятор Hotspot не генерирует инструкции aes-ni

#java #cryptography #aes #jvm-hotspot

#java #криптография #aes #jvm-hotspot

Вопрос:

Я хочу увидеть аппаратные инструкции aes-ni с помощью компилятора HotSpot. Я использую OpenJDK версии «1.8.0_191»

Я написал Java-программу для этой цели и запустил ее с помощью этой команды:

 java -XX: UnlockDiagnosticVMOptions -XX: UseAES -XX: UseAESIntrinsics -XX: PrintAssembly  AES > assembly.txt
  

Но я не могу увидеть аппаратные инструкции aes-ni (например, aesenc).

https://bugs.openjdk.java.net/browse/JDK-7184394 говорится, что jdk поддерживает инструкции aes-ni.

Я убедился, что метод компилируется и активирует XX:PrintIntrinsics, показанный ниже:

 @ 41 com.sun.crypto.provider.AESCrypt::decryptBlock (3852 bytes) (intrinsic) @ 41  
com.sun.crypto.provider.AESCrypt::encryptBlock (953 bytes) (intrinsic) @ 12   
java.lang.Math::addExact (26 bytes) (intrinsic) @ 572  
java.lang.System::arraycopy (0 bytes) (intrinsic) @ 41   
com.sun.crypto.provider.AESCrypt::decryptBlock (3852 bytes) (intrinsic) @ 41  
com.sun.crypto.provider.AESCrypt::encryptBlock (953 bytes) (intrinsic) @ 41  
com.sun.crypto.provider.AESCrypt::decryptBlock (3852 bytes) (intrinsic) @ 41  
com.sun.crypto.provider.AESCrypt::encryptBlock (953 bytes) (intrinsic)
  

Может кто-нибудь, пожалуйста, помочь в этом?
Спасибо

     import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class AES {

    private static SecretKeySpec secretKey;
    private static byte[] key;

    public static void setKey(String myKey)
    {
        MessageDigest sha = null;
        try {
            key = myKey.getBytes("UTF-8");
            sha = MessageDigest.getInstance("SHA-1");
            key = sha.digest(key);
            key = Arrays.copyOf(key, 16);
            secretKey = new SecretKeySpec(key, "AES");
        }
        catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    public static String encrypt(String strToEncrypt, String secret)
    {
        try
        {
            setKey(secret);
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
        }
        catch (Exception e)
        {
            System.out.println("Error while encrypting: "   e.toString());
        }
        return null;
    }
  

Комментарии:

1. Пожалуйста, опубликуйте весь исполняемый код для вашего класса AES , чтобы мы могли его воспроизвести. Сборка будет отображаться только в коде, который напрямую вызывает AESCrypt (то есть где-то внутри кода для библиотеки crypto), а не в вашем классе AES.

2. Для доступности AES-NI вам понадобится 64-разрядная серверная виртуальная машина. Вы уверены, что AES-NI не используется? В комментариях указано (intrinsic), и это может указывать на встроенные функции AES-NI — или я что-то упускаю?

3. Эрвин Болвидт. Спасибо за ответ. опубликовал полный код.

4. @Maarten Bodewes Спасибо . grep aes в печатной сборке мне ничего не показывает. Я видел ассемблерный код, созданный для встроенного, и не смог найти никаких инструкций aes.