2011-07-04 37 views
2

我一直在嘗試使AES加密和解密在Java中工作一段時間。不幸的是我沒有多少運氣。現在我可以生成的代碼,其中顯示AES - 生成一個密鑰並加載它給出一個無效的密鑰異常

keyGen = KeyGenerator.getInstance("AES"); 
SecureRandom random = SecureRandom.getInstance(); 
keyGen.init(size, random); 
SecretKey key = keyGen.generateKey(); 
AesKey = key.getEncoded(); 

要使用我將其轉換回一個SecretKeySpec的關鍵,並試圖加密的輸入字節的一個方法的一個關鍵。我的加密代碼如下所示。

SecretKeySpec keySpec = new SecretKeySpec(AesKey, "AES"); 
Cipher cipher = Cipher.getInstance("AES"); 
cipher.init(Cipher.ENCRYPT_MODE, keySpec); 
return cipher.doFinal(input); 

但是,當我調用cipher.init行時,我得到一個InvalidKeyException。

我是否錯誤地生成密鑰?我是否錯誤地加載了密鑰?這是一個組合嗎?我堅持這一點,所以任何見解將不勝感激。

更新

所以我沒有意識到這一點,但被調用生成函數的一部分傳入一個無效的大小。當我找到那些代碼並將其更改爲256時,一切正常。

+0

你可以添加作爲答案?未解答的問題隨着時間的推移被刪除。 – Reno

+0

SecureRandom應該*不*種子,你應該使用默認的構造函數。這將使用系統熵池作爲種子,這比使用時間戳更安全。對即將推出的Android API文檔進行了更新,這將有助於說明這一點。 (我編輯了你的代碼以反映這些變化。) –

回答

1

調用生成函數的代碼傳遞的是無效大小。我認爲這會被keyGen.generateKey()一行所捕獲,但我錯了。它直到我真正嘗試使用密鑰才拋出錯誤。更改調用生成函數的代碼以使大小爲256解決了問題。