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ć.