密码:IllegalBlockSizeException的原因是什么?

时间:2013-04-24 12:32:06

标签: java aes encryption

当我使用Cipher时,我发现了以下情况。

加密代码:

Cipher aes = Cipher.getInstance("AES");
aes.init(Cipher.ENCRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());

解密代码:

Cipher aes = Cipher.getInstance("AES");
aes.init(Cipher.DECRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());

运行Decrypt代码时,我得到IllegalBlockSizeException(输入长度​​必须是16的倍数)。

但如果我将解密代码更改为

Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding"); //I am passing the padding too
aes.init(Cipher.DECRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());

工作正常。 我知道它是algorithm/mode/padding模式。所以我认为这是因为我没有提到填充。所以我尝试在加密过程中给出模式和填充,

加密代码:

Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");//Gave padding during encryption too
aes.init(Cipher.ENCRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());

解密代码:

Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");
aes.init(Cipher.DECRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());

但它因IllegalBlockSizeException而失败。

原因是什么,为什么异常以及究竟发生了什么。 如果有人可以帮忙吗?提前致谢

更新

看起来问题在于我正在加密和解密的字符串。因为,即使我说的代码有效,也并不总是有效。我基本上是在加密UUID(例如:8e7307a2-ef01-4d7d-b854-e81ce152bbf6)。它适用于某些字符串,而不适用于某些字符串。

加密String的长度为64,可以被16整除。是的,我在同一台机器上运行它。

密钥生成方法:

    private Key generateKey() throws NoSuchAlgorithmException {
    MessageDigest digest = MessageDigest.getInstance("SHA");
            String passphrase = "blahbl blahbla blah";
    digest.update(passphrase.getBytes());
    return new SecretKeySpec(digest.digest(), 0, 16, "AES");
}

2 个答案:

答案 0 :(得分:8)

在解密过程中,如果输入数据不是块大小的倍数(AES为16字节),则 获得IllegalBlockSizeException

如果密钥或数据无效(但长度正确),则会得到BadPaddingException,因为明文中PKCS#5填充错误。偶尔填充看起来是偶然的,你根本就没有例外。


N.B。我建议你总是指定填充和模式。如果不这样做,如果提供商更改默认值,您可能会感到惊讶。 Sun提供商AFAIK会将"AES"转换为"AES/ECB/PKCS5Padding"

答案 1 :(得分:5)

虽然我还没有完全理解内幕,但我发现了问题所在。

我将加密的字符串作为GET请求参数获取。由于字符串包含不安全的字符,因此请求字符串会被破坏。解决方案是进行URL编码和解码。

我可以使用URLEncoderURLDecoder成功完成。

现在结果是一致的。谢谢:))

如果有人能为此做出更多贡献,我将不胜感激。