【问题标题】:EncryptionException: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipherEncryptionException:javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是 8 的倍数
【发布时间】:2011-10-04 05:16:43
【问题描述】:

我从 2006 年继承了一个旧的 java 项目(原来的开发人员早已不复存在,而且我以前从未编写过 Java 代码),我收到了这个错误:

EncryptionException: javax.crypto.IllegalBlockSizeException: 使用填充密码解密时,输入长度必须是 8 的倍数

它引用的代码如下所示:

public String decrypt( String encryptedString ) throws EncryptionException
{
    if ( encryptedString == null || encryptedString.trim().length() <= 0 )
            throw new IllegalArgumentException( "encrypted string was null or empty" );

    try
    {
        SecretKey key = keyFactory.generateSecret( keySpec );
        cipher.init( Cipher.DECRYPT_MODE, key );
        BASE64Decoder base64decoder = new BASE64Decoder();
        byte[] cleartext = base64decoder.decodeBuffer( encryptedString );
        byte[] ciphertext = cipher.doFinal( cleartext );

        return bytes2String( ciphertext );
    }
    catch (Exception e)
    {
        throw new EncryptionException( e );
    }
}

我不完全确定程序的内部工作原理,但我知道在这个项目目录中有一些配置文件和一个 key.properties 文件。就“输入长度”而言(如错误消息所指),我的数据库密码为 15 个字符长,而 key.properties 中的“密钥”为 25 个字符长。我不知道这是否重要。

注意事项:

  • 我尝试将数据库密码更改为 16 个字符(8 的倍数),但无济于事。
  • 我已阅读 thisthis,但他们没有帮助
  • 我正在将此项目从一台服务器移动到另一台服务器。它可以在其原始服务器上运行。
  • 原始服务器运行 JRE 1.4.2。新服务器运行 JRE 1.6u27。
  • 真的不想重建 .jar。我不是 Java 开发人员,项目规模很大。

感谢您的所有帮助。

【问题讨论】:

  • 我看到了两种可能性:JRE 1.6 对加密消息长度的验证规则比 JRE 1.4.2 更严格,或者字符串转换为字节的方式在两个平台上都不相同,例如由于关于它们的默认编码的差异。需要更多代码来进一步检查这种情况。无论如何,你可以在它工作的地方解密消息,然后在另一个平台上重新加密它以生成一个新的、有效的加密消息。
  • keySpec 是什么样的?您应该使用的实际算法是什么?

标签: java cryptography base64


【解决方案1】:

错误消息所指的输入是密文(奇怪的是cleartext),它是Base-64 解码操作的结果。确保您传递给此方法的 encryptedString 解码为长度为 8 的倍数的字节数组。

【讨论】:

  • 我想我明白了。我有一个外部配置文件,在我看来它是以纯文本形式存储数据库密码。事实证明,我的 XML 中“dbPassword”标签中的密码是所述密码的编码版本。我应该运行一个单独的进程来对密码进行编码、存储密钥并将编码版本放入配置文件中。基本上,我根本没有传入 encrpytedString。我传入的字符串不是 8 的倍数,也不是有效的 Base64 值。
  • @erickson- 所以基本上,2 个数组 byte[] cleartext 和 byte[] ciphertext 的长度应该是 8 的倍数,是这样吗?这足以摆脱异常吗?
  • @Shivam657 在原始帖子中,明文和密文的名称似乎是错误的,分别为ciphertextcleartext。所以这让你的问题有点模棱两可。此外,它取决于为密码指定的模式和填充。但是对于带有 CBC 和 PKCS #7 填充的 AES 之类的东西,密文将始终是 16 的倍数(AES 块大小)。对于 DES 或 3DES,块大小为 8,因此密文将是 8 的倍数,具有相同的模式和填充。
  • @erickson- 感谢您的评论,现在我觉得 byte[16] 密文应该可以工作。
【解决方案2】:

除非您想重新检查代码,否则您可能不应该更改 JRE 版本。我会先尝试在新服务器上降级您的 JRE 版本,尤其是因为代码以前可以工作。

【讨论】:

    猜你喜欢
    • 2019-04-14
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多