Java: не перехватывает намеренное исключение BadPaddingException

Мое приложение запрашивает у пользователя пароль, который использовался для шифрования контрольного файла. Если введен неправильный пароль, приложение отвечает, создавая новый контрольный файл. Поэтому мне нужно перехватить BadPaddingException, чтобы я мог вызвать соответствующий ответ.

Вот фрагмент кода, который должен сгенерировать исключение

private void existingHashFile(String file) {
        psUI = new passwordUI(new javax.swing.JFrame(), true, "existing");
        psUI.setVisible(true);
        this.key = passwordUI.key;
        try {
            hash.decryptHashFile(file, this.key); //this is line 240
        } catch (BadPaddingException ex) {
            Logger.getLogger(homePage.class.getName()).log(Level.SEVERE, null, ex);
            //then the file was not decrypted
            System.out.println("BPE 2!");
        } catch (Exception ex) {
            Logger.getLogger(homePage.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("BPE 3!");
        }

Для полноты, вот метод decryptHashFile, который вызывается выше

public void decryptHashFile(String filename, String key) throws BadPaddingException, UnsupportedEncodingException, Exception {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        CipherInputStream cis = null;   
        String outFile = filename.replace(".enc", "");
        byte[] byteKey = key.getBytes("UTF-8");

        Cipher cipher = getCipher(byteKey, "decrypt");

        try {
            fis = new FileInputStream(filename);
            fos = new FileOutputStream(outFile);
            cis = new CipherInputStream(fis, cipher);
            byte[] buffer = new byte[1024];
            int read = cis.read(buffer);
            while (read != -1) {
                fos.write(buffer, 0, read);
                read = cis.read(buffer); //this is line 197
            }
        } catch (IOException  ex) {
            Logger.getLogger(hashListClass.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (fos != null) {
                fos.close();
            }
            if (cis != null) {
               cis.close(); 
            }
            if (fis != null) {
               fis.close(); 
            }
        }
    }

Когда я намеренно ввел неправильный пароль, я вижу эту трассировку стека, но мой код (я использовал println в примере) не выполняется:

Dec 02, 2017 2:31:34 PM appwatch.hashListClass decryptHashFile
SEVERE: null
java.io.IOException: javax.crypto.BadPaddingException: Given final block not properly padded
    at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:121)
    at javax.crypto.CipherInputStream.read(CipherInputStream.java:239)
    at javax.crypto.CipherInputStream.read(CipherInputStream.java:215)
    at appwatch.hashListClass.decryptHashFile(hashListClass.java:197)
    at appwatch.homePage.existingHashFile(homePage.java:240)

1 ответ

CipherInputStream.read (твоя линия 197) бросает IOException не BadPaddingException следовательно, исключение отлавливается последующим catch (IOException ex),

После этого вы явно не выбрасываете другие исключения, поэтому больше нечего ловить после decryptHashFile,

Другие вопросы по тегам