加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用填充密码解密时,输入长度必须是16的倍数

发布时间:2020-12-15 00:47:08 所属栏目:Java 来源:网络整理
导读:我有一个服务器和客户端套接字程序,服务器向客户端发送加密消息,即 服务器端代码: cipher2 = Cipher.getInstance("AES"); secretKeySpec = new SecretKeySpec(decryptedText,"AES");cipher2.init(Cipher.ENCRYPT_MODE,secretKeySpec);feedback = "Your answ
我有一个服务器和客户端套接字程序,服务器向客户端发送加密消息,即
服务器端代码:
cipher2 = Cipher.getInstance("AES"); 
secretKeySpec = new SecretKeySpec(decryptedText,"AES");
cipher2.init(Cipher.ENCRYPT_MODE,secretKeySpec);
feedback = "Your answer is wrong".getBytes();
cipher2.doFinal(feedback);
dos.writeInt(feedback.length);
dos.write(feedback);

客户端代码:

int result_len = 0;
result_len = din.readInt();            
byte[] result_Bytes = new byte[result_len];
din.readFully(result_Bytes);
cipher2 = Cipher.getInstance("AES");
cipher2.init(Cipher.DECRYPT_MODE,aesKey);             
byte[] encrypt = cipher2.doFinal(result_Bytes);

异常抛出byte [] encrypt = cipher2.doFinal(result_Bytes);

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313)
    at javax.crypto.Cipher.doFinal(Cipher.java:2086)

问题是什么?

解决方法

有一个类似的问题.但重要的是要了解根本原因,并且可能因不同的用例而异.

情景1
您正尝试解密首先未正确编码的值.

byte[] encryptedBytes = Base64.decodeBase64(encryptedBase64String);

如果String由于某种原因配置错误或者编码不正确,您会看到错误“使用填充密码解密时输入长度必须是16的倍数”

场景2
现在,如果你有可能在url中使用这个编码的字符串(尝试在url中传入base64Encoded值,它将失败.
你应该做URLEncoding然后传入令牌,它会工作.

场景3当与其中一个供应商集成时,我们发现我们必须使用URLEncoder对Base64进行加密,但我们不需要解码它,因为它是由供应商在内部完成的

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读