2013-10-10 78 views
1

我知道類似的問題已經被問到,但我無法解決他們中的任何問題。文件解密:IllegalBlockSizeException:解密後的最後一個塊不完整

我有已與以下UNIX命令創建加密文件:

tar cf FILES | gzip | openssl enc -k PASSWORD -aes-256-cbc -e > OUTPUT.tar.gz.enc 

我可以成功地解密與相關聯的命令的文件。

我必須在Java進程中解密這個文件。我使用了this SO answer中提供的代碼。

我使用相同的EVP_BytesToKey功能,但略有不同main函數。

這是我的加載加密文件:

byte[] headerSaltAndCipherText = IOUtils.toByteArray(new 
InputStreamReader(new FileInputStream(f))); 

在該示例代碼,似乎數據以base64編碼。然而,當我看到我的文件,它不是(我可以清晰的看到「Salted__」標頭)

我創建了easCBC對象是這樣的:

Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC"); 

我在頂部加Security.addProvider(new BouncyCastleProvider());main函數。我開始使用BouncyCastle,因爲我被卡住了,但它沒有改變任何事情。

我也試過PKCS7PaddingNoPadding但沒有運氣。

我發現的常見問題是使用了錯誤的填充behing,或者加密的數據未被正確編碼/加載。

由於我沒有完全按照這個例子做,我想答案是第二個解決方案:我嘗試加載文件,如示例中,但我有這個例外java.nio.charset.MalformedInputException: Input length = 1,無論如何,我不能使用功能從JDK 1.7。

我在做什麼錯?

+1

爲了儘快提供更好的幫助,請將您的代碼發佈爲演示您的問題的[SSCCE](http://www.sscce.org)。這允許用戶複製/粘貼並重現您的問題。 –

回答

0

如果輸入文件不是字符數據(即Base64編碼),則不應使用InputStreamReader,只需從FileInputStream上直接讀取字節即可。如果輸入是Base64編碼,則需要將其作爲字符數據讀取並使用Base64解碼器將其轉換爲字節[]。

對於填充,OpenSSL enc命令使用PKCS5PADDING作爲分組密碼。

另一個問題可能是如何生成密鑰材料和初始化向量。您必須以OpenSSL提供輸入密碼的方式執行此操作。

最後(儘管看起來您還沒有運行過這個功能)如果您使用的是Oracle Java運行時環境或JDK,那麼您必須爲您的JRE安裝JCE Unlimited Strength策略文件才能使用AES256。

+0

刪除'InputStreamReader'解決了我的問題,謝謝!我無法找到哪個填充OpenSSL使用。 – Flanfl

+0

@Flanfl要查看正在使用哪些填充,請使用「NoPadding」(或等價物)進行解密,並查看最後一個塊的末尾。這將顯示任何填充已被添加。 – rossum

+0

好的謝謝,我會在下次:) – Flanfl

相關問題