Прервать CipherStream - PullRequest
0 голосов
/ 16 мая 2019

Привет, у меня проблемы с прерыванием операции шифрования.

В своем коде я шифрую файл и читаю его в память, а также проверяю состояние сброса, которое предполагает остановку шифрования.

Идея состоит в том, чтобы повысить производительность, прерывая операции, которые больше не запрашиваются пользователем.

Вот пример кода

Cihper cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.DECRYPT_MODE, someKey, someIV);

ByteArrayOutputStream out = new ByteArrayOutputStream();
try (InputStream in = new FileInputStream(someFile);
     CipherOutputStream cipherStream = new CipherOutputStream(out, cipher)) {
    int bytesRead;
    byte[] buffer = new byte[16 * 1024];
    while ((bytesRead = in.read(buffer)) > -1) {
        if (checkAbortCondition()) { //should abort
            return; //auto-closes the stream, this throws an exception!!
        }
        cipherStream.write(buffer, 0, bytesRead);
    }

    //more work...


} catch (Exception e) {
    //exception handling
}

Я получаю BadPaddingException, когдазакрытие потока заранее, это означает, что поток не завершил шифрование всех данных в файле.

бит трассировки стека:

java.io.IOException: javax.crypto.BadPaddingException
2019-05-16 12:39:38.722 11145-11665/com.bubu.android W/System.err:     at javax.crypto.CipherOutputStream.close(CipherOutputStream.java:214)

Q: есть ли способзакрыть CipherOutputStream без исключения?что-то вроде «прервать», который не будет вызывать doFinal()?

...