Я провел простой тест для измерения производительности AES-GCM в Java. 9, путем шифрования байтовых буферов в цикле. Результаты были несколько запутанными. Родное (аппаратное) ускорение вроде работает - но не всегда. В частности,
- При шифровании буферов размером 1 МБ в цикле скорость составляет ~60 МБ/с в течение первых ~50 секунд. Затем он подскакивает до 1100 МБ/с и остается там. Решит ли JVM активировать аппаратное ускорение через 50 секунд (или 3 ГБ данных)? его можно настроить? Где можно прочитать о новой реализации AES-GCM (помимо здесь).
- При шифровании 100-мегабайтных буферов аппаратное ускорение вообще не срабатывает. Скорость плоская 60 МБ/сек.
Мой тестовый код выглядит так:
int plen = 1024*1024;
byte[] input = new byte[plen];
for (int i=0; i < input.length; i++) { input[i] = (byte)i;}
byte[] nonce = new byte[12];
...
// Uses SunJCE provider
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
byte[] key_code = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
SecretKey key = new SecretKeySpec(key_code, "AES");
SecureRandom random = new SecureRandom();
long total = 0;
while (true) {
random.nextBytes(nonce);
GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, nonce);
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] cipherText = cipher.doFinal(input);
total += plen;
// print delta_total/delta_time, once in a while
}
Обновление за февраль 2019 г. HotSpot был изменен для решения этой проблемы. Исправление применяется в Java 13, а также переносится на Java 11 и 12.
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8201633, https://hg.openjdk.java.net/jdk/jdk/rev/f35a8aaabcb9
Обновление от 16 июля 2019 г. Недавно выпущенная версия Java (Java 11.0.4) устраняет эту проблему.
update
для небольшой его части и, наконец, вызываяdoFinal
для последнего фрагмента… - person Holger   schedule 21.02.2018update
, за которыми следуетdoFinal
, общий размер буфера становится неактуальным... - person Holger   schedule 22.02.2018