当前位置: 首页 > 知识库问答 >
问题:

Java AES decryption BadPaddingException

鲁阳焱
2023-03-14

注:Java NOOB。

好吧,我知道这个问题已经在这里回答了几十次,但是解决方案似乎不能直接适用于我理解的地方。(是的,我知道我不完全理解加密/解密、AES等,但这不是重点,我正在努力理解这一点)

我有一个实用程序 api,我想在其中传递一个字符串并返回一个加密的字符串。然后我想传递加密的字符串,并返回一个解密的字符串。简单。它适用于我传入的许多字符串,但在某些字符串上,我得到异常javax.crypto.BadPaddingException:给定最终块未正确填充。

例如,以下加密/解密很好。
util/加密/?令牌=123456789012wha=4TR0CbCcQKqeRK73zr83aw==
util/decrypt/?令牌=4TR0CbCcQKqeRK73zr83aw===123456789012wha

以下加密但不解密:
util/加密/?令牌=123456789012what=NYaWmwnySoGNHyNmY9Jh f3O2rqoLI1IAcnsl5V4OCE=
util/decrypt/?令牌=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;
}

我想这一定是调用< code > cipher . getinstance()的问题,我已经尝试使用< code > cipher . getinstance(" AES/CBC/pkcs 5 padding "),但解密时总是失败。我很想真正了解这里发生了什么,以及如何修复它。

共有2个答案

南门宇
2023-03-14

因为这个类直接作用于字节流,而不是字符流,所以它被硬编码为只编码/解码与低位127 ASCII图表(ISO-8859-1、Windows-1252、UTF-8等)兼容的字符编码。

转换为byte[]/string并不能保留所有数据。密文的文本表示并不是真正必要的,所以为什么要转换为字符串?

陆畅
2023-03-14

使用函数encodeBase64URLSafeString。javadoc说

使用base 64算法的URL安全变体对二进制数据进行编码,但不对输出进行分块。url安全变体发出-和_而不是和/字符。注意:不添加填充。

这应该可以解决问题。

 类似资料:

相关问答

相关文章

相关阅读