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

前端之家收集整理的这篇文章主要介绍了java – 使用填充密码解密时,输入长度必须是16的倍数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个服务器和客户端套接字程序,服务器向客户端发送加密消息,即
服务器端代码
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进行加密,但我们不需要解码它,因为它是由供应商在内部完成的

猜你在找的Java相关文章