2011-10-03 58 views
1

我從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的倍數),但無濟於事。
  • 我已閱讀thisthis並且他們沒有幫助
  • 我正在將此項目從一臺服務器移到另一臺服務器。它在其原始服務器上工作。
  • 原始服務器運行JRE 1.4.2。新服務器運行JRE 1.6u27。
  • I REALLY不想重建.jar。我不是一個Java開發人員,這個項目非常龐大。

感謝您的幫助。

+0

我看到兩種可能性:JRE 1.6具有更加嚴格的驗證規則,其中包含JRE 1.4.2的加密消息長度,或者字符串轉換爲字節的方式在兩種平臺上都不相同,例如由於其默認編碼的差異。需要更多的代碼來進一步檢查情況。無論如何,您可以在其工作的地方解密郵件,並在其他平臺上對其進行重新加密,以生成新的,有效的加密郵件。 –

+0

keySpec的外觀如何?什麼是你應該使用的實際算法? – emboss

回答

1

除非要重新檢查代碼,否則不應該更改JRE版本。我會嘗試在新服務器上降級你的JRE版本,尤其是在之前的代碼工作之前。

5

錯誤消息引用的輸入是Base-64解碼操作的結果的密文(奇怪地命名爲cleartext)。請確保您傳遞給此方法的encryptedString解碼爲長度爲8的倍數的字節數組。

+0

我想我明白了。我有一個外部配置文件,對我來說,它看起來像是以純文本格式存儲數據庫密碼。事實證明,我的XML中的「dbPassword」標記中的密碼是所述密碼的編碼版本。我應該運行一個獨立的進程來編碼密碼,存儲密鑰,並將編碼版本放入配置文件中。基本上,我沒有傳入一個encrpytedString。我傳入的字符串不是8的倍數,也不是有效的Base64值。 –

+0

@ erickson-所以基本上,2個數組byte [] cleartext和byte []密文的長度應該是8的倍數,是這樣嗎?這足以擺脫例外嗎? – Shivam657

+1

@ Shivam657在原始文章中,明文和密文的名稱看起來是錯誤的,分別爲「ciphertext」和「cleartext」。所以這讓你的問題有點模糊。此外,它取決於爲密碼指定的模式和填充。但對於像CBC和PKCS#7填充的AES,密文總是16倍(AES塊大小)。對於DES或3DES,塊大小爲8,所以密文將是8的倍數,具有相同的模式和填充。 – erickson

相關問題