Если вы попытаетесь расшифровать данные, заполненные PKCS5, с неверным ключом, а затем распаковать их (что автоматически выполняется классом Cipher), вы, скорее всего, получите исключение BadPaddingException (с вероятностью чуть меньше 255/256, около 99,61%), потому что заполнение имеет специальную структуру, которая проверяется во время распаковки, и очень немногие клавиши дают правильный заполнитель.
Итак, если вы получили это исключение, поймайте его и воспринимайте как «неправильный ключ».
Это также может произойти, если вы введете неправильный пароль, который затем используется для получения ключа из хранилища ключей или который преобразуется в ключ с помощью функции генерации ключа.
Конечно, плохое заполнение также может произойти, если ваши данные повреждены при транспортировке.
Тем не менее, в вашей схеме есть несколько замечаний по безопасности:
Для шифрования на основе пароля вы должны использовать SecretKeyFactory и PBEKeySpec вместо использования SecureRandom с KeyGenerator. Причина в том, что SecureRandom может быть разным алгоритмом в каждой реализации Java, давая вам другой ключ. SecretKeyFactory выполняет получение ключа определенным образом (и способом, который считается безопасным, если вы выберете правильный алгоритм).
Не использовать режим ECB. Он шифрует каждый блок независимо, что означает, что идентичные блоки простого текста также всегда дают идентичные блоки зашифрованного текста.
Предпочтительно использовать безопасный режим работы , такой как CBC (цепочка блоков шифрования) или CTR (счетчик). В качестве альтернативы используйте режим, который также включает аутентификацию, например GCM (режим счетчика Галуа) или CCM (счетчик с CBC-MAC), см. Следующий пункт.
Обычно вам требуется не только конфиденциальность, но и аутентификация, которая гарантирует, что сообщение не будет подделано. (Это также предотвращает атаки с использованием выбранного шифротекста на ваш шифр, т. Е. Помогает обеспечить конфиденциальность.) Итак, добавьте MAC (код аутентификации сообщения) к вашему сообщению или используйте режим шифрования, который включает аутентификацию (см. Предыдущий пункт).
Эффективный размер ключа DES составляет всего 56 бит. Это ключевое пространство довольно мало, оно может быть взломано за несколько часов преданным злоумышленником. Если вы сгенерируете свой ключ по паролю, это станет еще быстрее.
Кроме того, DES имеет размер блока всего 64 бита, что добавляет еще несколько недостатков в режимах цепочки.
Вместо этого используйте современный алгоритм, такой как AES, который имеет размер блока 128 бит и размер ключа
128 бит (для стандартного варианта).