2016-02-13 51 views
2

我使用密碼AES-cbc。我有一個thrid部分字符串加密和一個關鍵。如何工作java密碼aes-cbc

我想請教一些問題,

當我解密,我得到了異常

javax.crypto.BadPaddingException: Given final block not properly padded 
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) 
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) 
    at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..) 

我在論壇上閱讀,這可能是因爲加密密鑰和解密密鑰是型動物。這可能發生在我的問題?

另外我如何與cbc合作我需要一個iv向量。但我不知道iv矢量加密。我需要這個矢量嗎?我怎樣才能得到我?

+0

考慮接受有用的答案。 要接受答案,請點擊最佳答案旁邊的空白複選標記,這樣做會增加您的聲望並提供更多功能,請參閱[聲譽常見問題](http://stackoverflow.com/faq#reputation)請參閱[本頁](http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work)瞭解更多詳情。 另外請考慮回去並接受過去的答案,這樣做會增加你的聲望,並允許更多的功能,請參閱[聲譽常見問題](http://stackoverflow.com/faq#reputation) – zaph

回答

0

CBC代表密碼塊鏈接,這意味着加密一個數據塊的輸出與下一個輸入塊異或。對於第一個塊,隨機數據塊(稱爲IV)與輸入異或。 IV應該是隨機數據,並在執行加密時生成。你肯定需要IV,並且無法恢復它。你只能從產生它的人那裏得到它。沒有正確的IV幾乎肯定是你的填充異常的原因。

+1

IV只是一個原因如果消息只有一個單獨的塊,則爲異常。錯誤的IV僅影響第一塊。 –

+0

啊真的。我正在考慮加密,但解密你當然是對的。 – Kosh

0

填充錯誤通常意味着解密失敗,但不能依賴於確定正確的解密,並且如果向調用者報告可以創建可用於在沒有密鑰的情況下恢復原始文本的填充oracle。這可能是因爲用於加密和解密的填充方法,模式,密鑰或iv不相同。

最好是,如果密鑰和iv完全符合要求,則iv的長度與AES的16字節塊相同。密鑰可以是128位(16字節),192位(24字節)或256位(32字節)。

對於CBC模式,需要一個iv,最好的做法是生成一個隨機iv並將其加入到加密數據中,以使解密具有相同的iv可用性。 iv不需要保密。