我從2006年繼承了一箇舊的Java項目(原始開發已久,而且從未編寫過Java),其中我收到此錯誤:EncryptionException:javax.crypto.IllegalBlockSizeException:使用填充密碼進行解密時,輸入長度必須是8的倍數
EncryptionException: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
它引用的代碼如下所示:
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。
- I REALLY不想重建.jar。我不是一個Java開發人員,這個項目非常龐大。
感謝您的幫助。
我看到兩種可能性:JRE 1.6具有更加嚴格的驗證規則,其中包含JRE 1.4.2的加密消息長度,或者字符串轉換爲字節的方式在兩種平臺上都不相同,例如由於其默認編碼的差異。需要更多的代碼來進一步檢查情況。無論如何,您可以在其工作的地方解密郵件,並在其他平臺上對其進行重新加密,以生成新的,有效的加密郵件。 –
keySpec的外觀如何?什麼是你應該使用的實際算法? – emboss