2014-04-30 198 views
7

我對我行AES密鑰長度無效:128字節?

CIPHER.init(Cipher.ENCRYPT_MODE, keySpec); 

越來越java.security.InvalidKeyException: Invalid AES key length: 128 bytes及密碼是

Cipher CIPHER = Cipher.getInstance("AES"); 

和keySpec

SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); 

該密鑰是一個長度爲128的byte[]我通過的Diffie-Hellman了密鑰交換(儘管它在哪裏並不重要,對吧?),key完全填充了非零字節爲什麼Cipher.init(...)抱怨鑰匙長度錯誤? This webpage明確指出支持長度爲128的密鑰。

我在忽略什麼?

+5

我相信你想128位密鑰 - 不是128字節? –

+2

oops right herp derp。請把它作爲答案,所以我可以接受它,也許建議什麼加密算法使用128字節的密鑰 – vrwim

+0

好吧。現在發佈回答 –

回答

7

我認爲你需要128位密鑰在這裏用於AES算法 - 不是128字節。要將長鍵轉換爲需要的長度,您可以嘗試使用基於密碼的鍵推導函數。以PBKDF2爲例。

+3

對於像Diffie-Hellman組元素這樣的高熵材料來說,PBKDF2有點矯枉過正。有關該@vrwim的更多信息,請參閱https://stackoverflow.com/questions/23167936/generating-aes-key-after-ecdh – Perseids

+0

我已經閱讀了一些關於PBKDF2的內容,但似乎是密碼哈希值,所以它們是彩虹桌更難以破解。我有我的DH密鑰交換安全嗎?我想我只需要一個散列函數來將鍵值散列到合適的長度? – vrwim

+2

@vrwim是的,這應該是足夠的,檢查[這個Q/A](http://crypto.stackexchange.com/questions/15673/security-of-kdf1-and-kdf2-hash-based-kdfs)。 KDF1和2並不比散列輸出多得多。 –

1

AES算法允許128,192或256位密鑰長度。即16,24或32字節。您的密鑰長度應該是16,24或32個字節。

相關問題