Расшифровка Java AES, вызывающая исключение BadPaddingException

Я пытаюсь создать методы шифрования / дешифрования AES, но не могу получить исходный ввод без использования AES/ECB/NoPadding. Сейчас я пытаюсь использовать AES/CBC/PKCS7Padding. Я подтвердил, что чтение и запись байта в / из файла работает нормально. С заполнением PKCS7 я получаю исключение BadPaddingException от

cipher.doFinal(encrypted)

в методе расшифровки. Без дополнения, без исключений - однако вывод зашифрован. Я потратил время на просмотр других постов, посвященных этой же проблеме, но, похоже, не могу найти решение, подходящее для моей проблемы.

Как мне расшифровать этот вывод?

protected boolean encrypt(String place, String encrypt) {
    try {

        // encrypt the text
        cipher.init(Cipher.ENCRYPT_MODE, aesKey);
        byte[] encrypted = cipher.doFinal(encrypt.getBytes());

        Context context = HomeViewActivity.hva.getApplicationContext();
        FileOutputStream writer = context.openFileOutput(file_name.get(place.toUpperCase()), Context.MODE_PRIVATE);
        writer.write(encrypted);
        writer.close();
        return true; //successfully wrote encrypted string to file
    }catch(Exception e) {
        e.printStackTrace();
    }
    return false;
}
protected String decrypt(String place){
    String decrypted = null;
    try{
        Context context = HomeViewActivity.hva.getApplicationContext();
        // decrypt the text
        cipher.init(Cipher.DECRYPT_MODE, aesKey);
        FileInputStream reader = context.openFileInput(file_name.get(place.toUpperCase()));
        byte[] encrypted = new byte[reader.available()];
        reader.read(encrypted);
        reader.close();
        decrypted= new String(cipher.doFinal(encrypted));
    }catch(FileNotFoundException e){return null;}
    catch(IllegalBlockSizeException |
            BadPaddingException |
            InvalidKeyException |
            NoSuchAlgorithmException |
            IOException |
            NoSuchPaddingException e){e.printStackTrace();}
    return decrypted;
}

Редактировать 1: Зашифрованный массив считал из файла соответствующий размер

Редактировать 2: инициализированный ключ и шифр в конструкторе вместо каждого метода

1 ответ

Решение

Проблема в том, что ECB не использует IV, а CBC - и большинство других режимов работы используют значение IV. Java рандомизирует значение IV, когда оно явно не задано, что означает, что открытый текст после расшифровки не является правильным.

Для режима AES CBC это означает, что первые 16 байтов открытого текста - начальный блок - содержат случайные символы. Поскольку блоки после исходного блока содержат обычный открытый текст, вы не получите BadPaddingException в коде.

Обычное решение этой проблемы - добавить префикс IV к зашифрованному тексту или сначала записать его в основной поток. Само собой разумеется, что вы должны извлекать IV во время дешифрования и пропускать значение IV во время дешифрования, изменяя смещение в буфере или продвигая поток (для файлов вы можете не захотеть копировать весь зашифрованный текст).

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