У меня есть код дешифрования, который ожидает, что Cipher.doFinal() будет генерировать исключение при использовании неправильного ключа/iv. Кажется, это не происходит. Ну, это происходит, но не всегда.Cipher.doFinal() не выбрасывает исключение, если используется недействительный ключ
Мое шифрование использует «секунды» текущего времени в качестве семени для класса Random(). Затем он использует 16 (псевдо) случайных значений по модулю 256 для генерации 16-байтового ключа. Он шифрует этот ключ. Он использует один и тот же массив байтов для IV. Я инициализации шифра следующим образом:
Cipher.getInstance("AES/CBC/ISO10126Padding");
Циклы дешифрования через все возможные 60 вторых значений (0 - 59), используя ту же логику для генерации ключа и IV. Для каждого ключа и IV он пытается расшифровать зашифрованное значение. Обычно я получаю некоторое количество исключений BadPaddingException, но большую часть времени он преуспевает на «втором» значении, которое является неправильным. Как и ожидалось, я возвращаю мусор. Я ожидал, что doFinal() всегда будет генерировать исключение, если используется неправильный ключ/iv. Есть ли причина, почему это не так?
В качестве примера:
Если ток второго равен 45, когда я зашифровать он будет использовать это значение для генерации ключа/IV. Когда я пытаюсь расшифровать, я сижу в цикле for от 0 до 59, пробуя каждое из этих значений до тех пор, пока doFinal() не удастся (например, не генерирует исключение). Обычно я вижу некоторое количество исключений BadPaddingException, но цикл заканчивается до 45, и я возвращаю мусор.
я нашел это:
Java AES decryption detect incorrect key
который, кажется, связаны между собой, хотя я не использую шифра потока.
Из моего расчета только 6% неправильных ключей должны производить мусор с ISO10126Padding. Другие 94% должны привести к исключению BadPaddingException. Это то, что вы видите или ваши результаты разные? –