Медлительность расшифровки AES-GCM JAVA

Я пытаюсь расшифровать файл размером 50 МБ в режиме AES-GCM (cipherinputstream) с помощью JDK 1.11.0.6, и это занимает 9 минут, в то время как то же самое в режиме CTR занимает 10 секунд, я что-то здесь упустил? Шифрование в режимах CTR и GCM занимает всего около 600 мс.

Я видел предыдущую запись Java 9: ​​производительность AES-GCM.

Я пробовал с JDK 1.8, 1.9, 1.11.0.6 и даже 1.13.

Удивительно, но JDK 1.9 занимает 3 минуты, а все остальные - около 9-10 минут, что определенно неприемлемо по сравнению с 10 секундами, полученными в режиме CTR.

Тот же код с Bouncy Castle Provider расшифровывается за 700 мс. Разница между реализацией BC и нативной реализацией Java настолько огромна?

образец кода,

public static void encryptfile() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IOException {
    InputStream fin = new FileInputStream("test.txt");
    OutputStream fout = new FileOutputStream("enc_test.txt");
    SecretKeySpec serverKey = new SecretKeySpec(HexConverterUtil.BASE16_DECODE("a4e97a4713841586ca639a416c636e3ef2a404efaf58b0a7768cd5758b1297a0"), "AES");
    GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(16 * 8, HexConverterUtil.BASE16_DECODE("258f7d4c1c72bee0109bcbe5"));
    Cipher encryptCipher = Cipher.getInstance("AES/GCM/NoPadding");
    encryptCipher.init(Cipher.ENCRYPT_MODE, serverKey, gcmParameterSpec);
    fout = new CipherOutputStream(fout, encryptCipher);

    byte[] bytesBuffer = new byte[4096];
    int bytesRead = 0;

    while ((bytesRead = fin.read(bytesBuffer)) != -1) {
        fout.write(bytesBuffer, 0, bytesRead);
    }
    fin.close();
    fout.close();
}

public static void decryptfile() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IOException {
    InputStream fin = new FileInputStream("enc_test.txt");
    SecretKeySpec serverKey = new SecretKeySpec(HexConverterUtil.BASE16_DECODE("a4e97a4713841586ca639a416c636e3ef2a404efaf58b0a7768cd5758b1297a0"), "AES");
    GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(16 * 8, HexConverterUtil.BASE16_DECODE("258f7d4c1c72bee0109bcbe5"));
    Cipher decryptCipher = Cipher.getInstance("AES/GCM/NoPadding");
    decryptCipher.init(Cipher.DECRYPT_MODE, serverKey, gcmParameterSpec);
    fin = new CipherInputStream(fin, decryptCipher);

    OutputStream fout = new BufferedOutputStream(new FileOutputStream("dec_test.mp3"));

    byte[] bytesBuffer = new byte[4096];
    int bytesRead = 0;

    while ((bytesRead = fin.read(bytesBuffer)) != -1) {
        fout.write(bytesBuffer, 0, bytesRead);
    }
    fin.close();
    fout.close();
}

person vigneshwaran    schedule 22.01.2020    source источник
comment
Этот вопрос будет лучше, если вы опубликуете свои коды и метод измерения и т. д. Как можно воспроизвести ваш случай?   -  person kelalaka    schedule 22.01.2020
comment
Добавлен пример кода, который я использовал для шифрования и расшифровки файла в AES-GCM.   -  person vigneshwaran    schedule 22.01.2020
comment
правильно исправьте эту ошибку   -  person Ebbe M. Pedersen    schedule 22.01.2020
comment
Довольно глупо, что они не разрешили расшифровку перед проверкой тегов, поэтому такие вещи терпят неудачу. Они никогда не должны были помещать тег в зашифрованный текст в первую очередь. Соглашусь с Эббе, наверное это тот баг.   -  person Maarten Bodewes    schedule 23.01.2020
comment
ошибка должна быть исправлена ​​​​в java 13 и перенесена на 11 и 12. Но я также сталкиваюсь с этой проблемой в 11, 12 и 13.   -  person vigneshwaran    schedule 24.01.2020
comment
Хм, не могли бы вы попробовать с буфером и Cipher#update/#doFinal и без CipherOutputStream? Вы также можете попробовать сопоставить файлы и использовать ByteBuffers, я не знаю, может ли это быть быстрее. Лично мне пока не очень нравятся реализации CipherIn/OutputStream. Кстати, я бы использовал буферы размером 1 МБ или около того. Я имею в виду, кого это волнует...   -  person Maarten Bodewes    schedule 24.01.2020
comment
Даже без AES-NI, если это не займет минут, здесь чего-то не хватает. В самом деле, не могли бы вы сделать чистую операцию ByteBuffer? (без CipherStream)   -  person gusto2    schedule 27.01.2020