#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.