密码:IllegalBlockSizeException的原因是什么?
当我使用密码时,我观察到了以下内容。
加密码:
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());
我在运行解密代码时得到非法BlockSizeException(输入长度必须是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());
但是它失败了 非法BlockSizeException。
原因是什么,为什么例外,以及下面到底发生了什么。如果有人可以帮忙?提前致谢
更新
看起来问题出在我正在加密和解密的字符串上。因为,即使我说的代码有效,也并不总是有效。我基本上是在加密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");
}