21

我在使用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());

在运行解密代码时,我得到 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)。它适用于某些字符串,但不适用于某些其他字符串。

加密字符串的长度是 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");
}
4

2 回答 2

9

在解密期间,只有IllegalBlockSizeException当输入数据不是块大小的倍数(AES 为 16 字节)时,才能得到一个。

如果密钥或数据无效(但长度正确),您会得到 a BadPaddingException,因为 PKCS #5 填充在明文中是错误的。偶尔,填充会偶然出现正确的,你也不会例外。


注意我建议您始终指定填充和模式。否则,如果提供商更改默认设置,您可能会感到惊讶。AFAIK,Sun 提供商转换"AES""AES/ECB/PKCS5Padding".

于 2013-04-24T14:41:16.160 回答
6

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

我获取加密字符串作为 GET 请求参数。由于字符串包含不安全的字符,因此在请求时字符串会损坏。解决办法是,做URL编码和解码。

我可以使用URLEncoderURLDecoder成功地做到这一点。

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

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

于 2013-04-24T14:40:55.407 回答