IllegalBlockSizeException:使用填充密码解密时,输入长度必须是 8 的倍数
Posted
技术标签:
【中文标题】IllegalBlockSizeException:使用填充密码解密时,输入长度必须是 8 的倍数【英文标题】:IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher 【发布时间】:2013-06-20 05:14:25 【问题描述】:我有以下方法:
public String decrypt(String strToBeDecrypted)
try
strToBeDecrypted = URLDecoder.decode(strToBeDecrypted, "UTF-8");
DESKeySpec desKeySpec = new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey skey = keyFactory.generateSecret(desKeySpec);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, skey, ivSpec);
byte[] keyByteArray = new BASE64Decoder().decodeBuffer(strToBeDecrypted);
byte[] original = cipher.doFinal(keyByteArray);
return new String(original, "UTF-8");
catch (Exception e)
logger.error(ExceptionUtil.getDetailedMessage(e));
return "";
这是在扔
"name=javax.crypto.IllegalBlockSizeException;message=Input length must be multiple of 8 when decrypting with padded cipher;"
在下面一行:
byte[] original = cipher.doFinal(keyByteArray);
谁能告诉我这里有什么问题?
【问题讨论】:
试图打印出keyByteArray.length
?是 8 的倍数吗?
您也可以发布您的加密代码吗?也许创建一个SSCCE 来触发您的异常。
旁注:如果您有任何选择,请不要使用 DES - 它太弱了。考虑三重 DES,或者最好是 AES。
【参考方案1】:
它所指的输入长度是密文的长度 (strToBeDecrypted),它预计是块大小的倍数。这意味着默认情况下,库期望您的输入被填充。
这意味着您要么需要在解密时将填充设置为“无”(因为那是加密时使用的“填充”),要么您以某种方式破坏了密文。
尝试将“DES”更改为“DES/ECB/NoPadding”。我不知道您的实现的默认密码模式是什么,但它通常是“ECB”或“CBC”。如果这两个都不起作用,那么您正在沿线某处破坏您的密文。
【讨论】:
【参考方案2】:请使用这个。它对我有用。
public String decrypt(String message) throws Exception
final MessageDigest md = MessageDigest.getInstance("md5");
final byte[] digestOfPassword = md.digest("HG58YZ3CR9"
.getBytes("utf-8"));
final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8;)
keyBytes[k++] = keyBytes[j++];
final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
final Cipher decipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
decipher.init(Cipher.DECRYPT_MODE, key, iv);
final byte[] encData = new sun.misc.BASE64Decoder().decodeBuffer(message);
final byte[] plainText = decipher.doFinal(encData);
return new String(plainText, "UTF-8");
【讨论】:
以上是关于IllegalBlockSizeException:使用填充密码解密时,输入长度必须是 8 的倍数的主要内容,如果未能解决你的问题,请参考以下文章
获取 IllegalBlockSizeException:使用 rsa 时数据不得超过 256 个字节
RSA加密:javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes
Android 8.0:使用 RSA/ECB/OAEPWithSHA-512AndMGF1Padding 时出现 IllegalBlocksizeException
Base64加密解密不一致导致AES加密报出javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 wh
Android AES加密报错处理:javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_in