Расшифровка 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")
но это всегда терпит неудачу при расшифровке. Я бы очень хотел понять, что здесь происходит и как это исправить.