Расшифровка Java AES BadPaddingException

примечание: Java NOOB.

Хорошо, я знаю, что на этот вопрос здесь уже отвечали несколько десятков раз, но решения, похоже, не работают / не применяются непосредственно там, где я их понимаю. (Да, я знаю, что не совсем понимаю шифрование / дешифрование, AES и т. Д., Но это не главное, я пытаюсь это понять)

У меня есть утилита API, где я хочу передать строку и вернуть зашифрованную строку. Затем я хочу передать зашифрованную строку и вернуть расшифрованную строку. Просто. Он отлично работает для многих строк, которые я передаю, но для некоторых я получаю исключениеjavax.crypto.BadPaddingException: Given final block not properly padded.

Например, следующее шифрует / дешифрует нормально.
util/encrypt/?token=123456789012wha = 4TR0CbCcQKqeRK73zr83aw ==
util/decrypt/?token=4TR0CbCcQKqeRK73zr83aw== = 123456789012wha

Следующее шифрует, но не расшифровывает:
util/encrypt/?token=123456789012what = NYaWmwnySoGNHyNmY9Jh + f3O2rqoLI1IAcnsl5V4OCE =
util/decrypt/?token=NYaWmwnySoGNHyNmY9Jh+f3O2rqoLI1IAcnsl5V4OCE= = исключение

Вот код в моем контроллере:

private static final String ALGO = "AES";


@RequestMapping(value = "/util/encrypt/", method = RequestMethod.GET)
@ResponseBody
public String encrypt(HttpServletResponse httpResponse,
        @RequestParam(value = "token", required=true) String token) throws Exception 
{
    Key key = generateKey();
    Cipher c = Cipher.getInstance(ALGO);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encVal = c.doFinal(token.getBytes());
    String encryptedValue = Base64.encodeBase64String(encVal);
    return encryptedValue.trim();
}



@RequestMapping(value = "/util/decrypt/", method = RequestMethod.GET)
@ResponseBody
public String decrypt(HttpServletResponse httpResponse,
        @RequestParam(value = "token", required=true) String token) throws Exception 
{
    token = URLDecoder.decode(token, "UTF-8");
    Key key = generateKey();
    Cipher c = Cipher.getInstance(ALGO);
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] decordedValue = Base64.decodeBase64(token);
    byte[] decValue = c.doFinal(decordedValue);
    String decryptedValue = new String(decValue);
    return decryptedValue.trim();
}



private Key generateKey() throws Exception 
{
    Key key = new SecretKeySpec(getAesKey().getBytes(), ALGO);
    return key;
}

Я полагаю, что это должно быть что-то с вызовомCipher.getInstance() и я пытался использоватьCipher.getInstance("AES/CBC/PKCS5Padding") но это всегда терпит неудачу при расшифровке. Я бы очень хотел понять, что здесь происходит и как это исправить.

Ответы на вопрос(2)

Ваш ответ на вопрос