javax.crypto.IllegalBlockSizeException: last block incomplete in decryption
时间: 2023-12-15 13:40:39 浏览: 224
这个异常通常是在使用对称加密算法进行解密时出现的。它的原因是密文的长度不是块长度的整数倍,导致无法正确解密最后一个块。
要解决这个问题,有两种常见的方法:
1. 填充法
可以在加密时采用填充法,将明文填充到块长度的整数倍。常见的填充方法有 PKCS5Padding 和 PKCS7Padding,可以使用 javax.crypto.Cipher 类中的相应方法进行加解密。
2. 分段解密
可以将密文分成块,每次解密一个块。如果发现最后一个块的长度不足块长度,可以将其舍去。这种方法需要在加密时记录分块信息,通常使用自定义的协议进行传输。
需要注意的是,在使用分段解密方法时,为了防止数据被篡改,需要对每个块使用 CBC(Cipher Block Chaining)模式进行解密,且需要使用 IV(Initialization Vector)进行初始化。
相关问题
java.lang.RuntimeException: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
引用中的错误提示"javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher"是在解密过程中出现的异常。这个异常的意思是解密的输入长度必须是8的倍数才能使用填充模式进行解密。同样的,引用中的异常提示"javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher"是在AES解密过程中出现的异常。这个异常的意思是解密的输入长度必须是16的倍数才能使用填充模式进行解密。而引用中的异常提示"java.lang.RuntimeException: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher"也是在解密过程中出现的异常,意思与前两个异常相同,都是解密的输入长度必须是16的倍数才能使用填充模式进行解密。所以,解决这个问题的方法就是确保解密的输入长度是符合要求的,即是8的倍数或是16的倍数。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padd](https://blog.csdn.net/weixin_45915335/article/details/124152930)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *2* [javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with pad](https://blog.csdn.net/qq_30624649/article/details/114937740)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *3* [java javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes](https://blog.csdn.net/weixin_38081382/article/details/125485124)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
[ .reference_list ]
javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
这个异常是因为在使用AES解密时,解密的字符串的数组长度不是16的倍数所导致的。在AES加密中,加密的数据长度必须是16的倍数,如果不是,则需要进行填充。而在解密时,如果解密的数据长度不是16的倍数,则会抛出该异常。为了解决这个问题,可以在加密时使用填充方式,例如PKCS5Padding,来保证加密后的数据长度是16的倍数。同时,在解密时也需要使用相同的填充方式来解密。
阅读全文