Deszyfrowanie Java AES BadPaddingException

uwaga: Java NOOB.

W porządku, wiem, że na to pytanie udzielono odpowiedzi kilkadziesiąt razy, ale rozwiązania nie wydają się działać / stosować bezpośrednio tam, gdzie je rozumiem. (Tak, wiem, że nie rozumiem do końca szyfrowania / deszyfrowania, AES itp., Ale to nie o to chodzi, staram się to zrozumieć)

Mam api narzędzia, w którym chcę przekazać ciąg i zwrócić zaszyfrowany ciąg. Następnie chcę przekazać zaszyfrowany łańcuch i zwrócić odszyfrowany ciąg. Prosty. Działa dobrze dla wielu przekazywanych ciągów, ale na niektórych otrzymuję wyjątekjavax.crypto.BadPaddingException: Given final block not properly padded.

Na przykład następujące szyfrowanie / deszyfrowanie jest w porządku.
util/encrypt/?token=123456789012wha = 4TR0CbCcQKqeRK73zr83aw ==
util/decrypt/?token=4TR0CbCcQKqeRK73zr83aw== = 123456789012wha

Następujące szyfruje, ale nie odszyfrowuje:
util/encrypt/?token=123456789012what = NYaWmwnySoGNHyNmY9Jh + f3O2rqoLI1IAcnsl5V4OCE =
util/decrypt/?token=NYaWmwnySoGNHyNmY9Jh+f3O2rqoLI1IAcnsl5V4OCE= = wyjątek

Oto kod w moim kontrolerze:

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;
}

Myślę, że to coś z rozmowąCipher.getInstance() i próbowałem użyćCipher.getInstance("AES/CBC/PKCS5Padding") ale to zawsze kończy się niepowodzeniem podczas deszyfrowania. Bardzo chciałbym naprawdę zrozumieć, co się tutaj dzieje i jak to naprawić.

questionAnswers(2)

yourAnswerToTheQuestion