我有一个服务器和客户端套接字程序,服务器向客户端发送加密消息,即
服务器端代码:
服务器端代码:
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进行加密,但我们不需要解码它,因为它是由供应商在内部完成的