Java AES-Entschlüsselung BadPaddingException

Anmerkung: Java NOOB.

Okay, ich weiß, dass dies hier ein paar Dutzend Mal beantwortet wurde, aber die Lösungen scheinen nicht direkt dort zu funktionieren / gelten, wo ich sie verstehe. (Ja, ich weiß, dass ich die Verschlüsselung / Entschlüsselung, AES usw. nicht vollständig verstehe, aber das ist nicht der Punkt, ich versuche dies zu verstehen.)

Ich habe eine Utility-API, in der ich eine Zeichenfolge übergeben und eine verschlüsselte Zeichenfolge zurückgeben möchte. Dann möchte ich die verschlüsselte Zeichenfolge übergeben und eine entschlüsselte Zeichenfolge zurückgeben. Einfach. Es funktioniert gut für viele Saiten, die ich eingebe, aber bei einigen bekomme ich die Ausnahmejavax.crypto.BadPaddingException: Given final block not properly padded.

Zum Beispiel verschlüsselt / entschlüsselt das Folgende gut.
util/encrypt/?token=123456789012wha = 4TR0CbCcQKqeRK73zr83aw ==
util/decrypt/?token=4TR0CbCcQKqeRK73zr83aw== = 123456789012wha

Das Folgende verschlüsselt, aber entschlüsselt nicht:
util/encrypt/?token=123456789012what = NYaWmwnySoGNHyNmY9Jh + f3O2rqoLI1IAcnsl5V4OCE =
util/decrypt/?token=NYaWmwnySoGNHyNmY9Jh+f3O2rqoLI1IAcnsl5V4OCE= = Ausnahme

Hier ist der Code in meinem Controller:

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

Ich denke, es muss etwas mit dem Anruf seinCipher.getInstance() und ich habe versucht mitCipher.getInstance("AES/CBC/PKCS5Padding") das scheitert aber immer beim entschlüsseln. Ich würde gerne wirklich verstehen, was hier passiert und wie man es behebt.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage