【发布时间】: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 的倍数),但无济于事。
- 我已阅读 this 和 this,但他们没有帮助
- 我正在将此项目从一台服务器移动到另一台服务器。它可以在其原始服务器上运行。
- 原始服务器运行 JRE 1.4.2。新服务器运行 JRE 1.6u27。
- 我真的不想重建 .jar。我不是 Java 开发人员,项目规模很大。
感谢您的所有帮助。
【问题讨论】:
-
我看到了两种可能性:JRE 1.6 对加密消息长度的验证规则比 JRE 1.4.2 更严格,或者字符串转换为字节的方式在两个平台上都不相同,例如由于关于它们的默认编码的差异。需要更多代码来进一步检查这种情况。无论如何,你可以在它工作的地方解密消息,然后在另一个平台上重新加密它以生成一个新的、有效的加密消息。
-
keySpec 是什么样的?您应该使用的实际算法是什么?
标签: java cryptography base64