Компилятор Hotspot не генерирует инструкции aes-ni - PullRequest
2 голосов
/ 28 марта 2019

Я хочу увидеть аппаратные инструкции 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;
    }
...