Java解密会引发异常

时间:2014-07-17 15:02:16

标签: java encryption cryptography des

这是我的加密方法(值是输入参数):

 byte key_bytes[] = "12345678".getBytes();
 SecretKeySpec _keyspec = new SecretKeySpec(key_bytes, "DES");
 Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); // Yes, I know I shouldn't use DES
 cipher.init(Cipher.ENCRYPT_MODE, _keyspec);

 byte[] utf8 = value.getBytes("UTF8");
 byte[] enc = cipher.doFinal(utf8);   // Encrypt

 String encrypted = new String(new Base64().encode(enc));

 return URLEncoder.encode(encrypted, "UTF-8");

这是我的解密方法(值是输入参数):

byte key_bytes[] = "12345678".getBytes();
SecretKeySpec _keyspec = new SecretKeySpec(key_bytes, "DES");
Cipher dcipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
dcipher.init(Cipher.DECRYPT_MODE, _keyspec);

byte[] dec = new Base64().decode(value);
byte[] utf8 = dcipher.doFinal(dec);  // Decrypt, throws exception
return new String(utf8, "UTF8");

我得到一个例外:

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher

我已经阅读了不同的主题,所以我发现,当没有填充并且存在另一种密码模式时会发生此异常。那么,有什么不对?

2 个答案:

答案 0 :(得分:2)

您的解密方法中缺少URLDecoder。请注意,如果字符串已经以任何其他方式泄露,并且长度不再是块大小的倍数,那么您将收到ECB和CBC操作模式的此异常。

答案 1 :(得分:1)

如异常堆栈所示,长度必须是8的倍数。

因此,长度为8,16,24,...对关键字节有效。

尝试长度为8(12345678)

byte key_bytes[] = "12345678".getBytes();

如果错误仍然存​​在,您可以按照此answer

进行操作

更新

如果您想使用URLDecoder,请在解密方法中尝试使用此代码,

String decryptd = URLDecoder.decode(value, "UTF-8");
byte[] dec = new Base64().decode(decryptd);
byte[] utf8 = dcipher.doFinal(dec);  
return new String(utf8, "UTF-8");