当前位置: 首页 > 面试题库 >

密码:IllegalBlockSizeException的原因是什么?

秦学林
2023-03-14
问题内容

与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)。它适用于某些字符串,不适用于某些其他字符串。

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

问题答案:

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

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

注意:我建议您始终指定填充和模式。如果您不这样做,那么如果提供程序更改了默认设置,您可能会感到惊讶。Sun提供商AFAIK转换"AES""AES/ECB/PKCS5Padding"



 类似资料:
  • 问题内容: 当我尝试运行程序时,出现以下错误 请帮忙 问题答案: 从Javadoc: 如果Java虚拟机找不到声明为native的方法的适当本机语言定义,则抛出该异常。 这是与JNI相关的错误。loadJacobLibrary试图加载名为jacob-1.14.3-x86的本机库,但在java.library.path定义的路径上找不到该库。启动JVM时,应将此路径定义为系统属性。例如 在Windo

  • 在这里抛出RejectedExecutionException是否有其他原因? java.util.concurrent.RejectedExecutionException:任务java.util.concurrent.FutureTask@4194a5f0被java.util.concurrent.ThreadPoolExecutor@41a36e90拒绝[终止,池大小=0,活动线程=0,排队

  • 我有一个非常基本的问题,涉及到用户管理,尤其是存储散列密码。我读了几页(比如https://wiki.python.org/moin/Md5Passwords ). 我对哈希的理解是: 用户提供的密码是单向散列的(使用任何函数) 没有人(包括用户/管理员)能看到密码 当用户登录时,他提供的字符串将被散列,以查看它是否与存储的散列密码匹配 这一切都很清楚,但我不确定哈希中的“salt”是什么意思。我

  • 问题内容: 关于Java的InterruptedException有一些有趣的问题和答案,例如Java中的InterruptedException 的原因和处理InterruptedException。但是,它们都没有告诉我InterruptedException的可能来源。 像SIGTERM,SIGQUIT,SIGINT这样的OS信号呢?在命令行上按CTRL-C是否会产生InterruptedE

  • 在哪些情况下,应该使用? 是否只是为了合法性问题? 如果是,那么问题是什么? 因为我仍然使用开发我的所有项目

  • 问题内容: 我见过很多人声称您应该在选择查询中专门为想要的每一列命名。 假设我仍然要使用所有列,为什么我不使用? 即使考虑问题* SQL查询-从视图选择或从视图*选择col1,col2,’colN,我也不认为这是完全相同的副本,因为我正从略有不同的观点着手解决这个问题。 我们的原则之一是在优化之前就不进行优化。考虑到这一点,在被证明是资源问题或架构几乎是固定的之前,似乎应该使用 首选的 方法。众所