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

我从2006年inheritance了一个旧的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的倍数),但无济于事。
  • 我已经阅读了这个和他们没有帮助
  • 我正在将这个项目从一个服务器移动到另一个服 它适用于原始服务器。
  • 原始服务器运行JRE 1.4.2。 新服务器运行JRE 1.6u27。
  • 真的不想重建.jar。 我不是一个java开发人员,项目非常庞大。

感谢你的帮助。

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

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