【】javax.crypto.IllegalBlockSizeException: Input length not multiple of 8 bytes

问题描述

jdk版本:8

用DES进行加解密,其中转换模式为“DES/CBC/NoPadding”,要加密的明文为 “密码学浅析”,执行加密操作,报如下错误

Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length not multiple of 8 bytes
	at com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1109)
	at com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:1053)
	at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:853)
	at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
	at javax.crypto.Cipher.doFinal(Cipher.java:2164)
	at com.example.jcrypt.service.impl.DesDemoImpl.encryptEnhance(DesDemoImpl.java:88)
	at com.example.jcrypt.service.impl.DesDemoImpl.jdk8Des(DesDemoImpl.java:54)
	at com.example.jcrypt.service.impl.DesDemoImpl.main(DesDemoImpl.java:38)

原因分析

转换模式的填充模式是NoPadding,不填充,而明文为五个汉字,在utf8编码下为15个字节,不是8的倍数,所以报错。

解决方法

方法1:修改明文

把明文改成8字节倍数的数据,如:密码学浅析哈哈哈,这样在utf8编码下,其字节长度为24,是8的倍数,可以正常加密。

很显然,这种方法并不可取!!

方法2:修改填充模式

不要使用NoPadding的填充模式,可以使用PKCS5Padding的填充模式。

参考文章

https://blog.csdn.net/z19950712/article/details/108837487

你可能感兴趣的:(Java&JVM,密码学)