Вам необходимо использовать тот же Секретный ключ и тот же Вектор инициализации при расшифровке, который использовался для шифрования. Этот код использует другой случайный IV для шифрования, чем для дешифрования. Часто IV - это то, что может быть вычислено поэтапно обеими сторонами, или оно добавляется к зашифрованному сообщению, если это случайные байты, как в этом коде.
Вы можете повторно использовать ключ с течением времени, но вы должны не повторно использовать ключ и IV для нескольких сообщений. См. Для шифрования AES CB C, какое значение имеет шифрование IV? и AES, как транспортировать IV , с вопросами и ответами о векторе инициализации и дополнительной информацией о том, почему использовать фиксированный IV или повторно использовать IV и т. д.
Байты заполнения добавляются к сообщению (до шифрования), чтобы его длина была кратна размеру блока шифра (см. https://en.wikipedia.org/wiki/Padding_ (криптография) # PKCS # 5_and_PKCS # 7 , если интересно).
Когда байтовый массив дешифруется с использованием другого IV, дешифрованный текст не будет таким же, как открытый текст (по крайней мере, в первом блок). Если после расшифровки байты заполнения не совпадают (что может иметь место для короткого открытого текста), они не будут распознаваемы, и это приведет к BadPaddingException
.
(в этом есть другая незначительная проблема code: он преобразует текст в байты для шифрования с использованием кодировки символов UTF-8, но преобразует дешифрованные байты обратно в текст, используя кодировку символов платформы по умолчанию, которая может быть не UTF-8. Что-то вроде decryptedId = new String(original, "UTF-8");
в decrypt
метод будет одним из возможных исправлений.)