Расшифровка 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)

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