我从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开发人员,因此该项目非常庞大。


感谢你的帮助。

最佳答案

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

10-06 16:15