2016-11-23 50 views
0

我有在Java中AES自定義鍵,而不是16,24個或32字節

與鍵AES問題,這是我的代碼:

public Core(String key) { 
    try { 
     this.SecretKey = key; 
     this.ivspec = new IvParameterSpec(this.iv.getBytes()); 
     this.keyspec = new SecretKeySpec(SecretKey.getBytes("UTF-8"), "AES"); 
     try { 
      this.cipher = Cipher.getInstance("AES/CBC/NoPadding"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 
} 

每當我把這個字符串的「鑰匙」,它包含例如Pizza,它只是產生錯誤。當我傳遞一個包含16個字節的字符串時,它可以工作。我想使用AES,但我不希望它僅限於16,24或32字節。我怎樣才能解決這個問題。

+1

我剛剛被一個加密中小企業問道:「你爲什麼要使用非標準的密鑰大小? – zaph

回答

4

對於具有不同密鑰大小(以及不同塊大小)的AES,請看Rijndael。但是,鑑於您使用「比薩」作爲關鍵,使用Rijndael可能對您而言太過先進。請使用Key Derivation Function(KDF)將密碼(「Pizza」)變成密碼密鑰。如果您不確定使用什麼KDF,請查看PBKDF2。

我還建議使用密碼而不是密碼作爲KDF的輸入:「我喜歡火腿和菠蘿比薩。」

ETA:首選將PKCS7填充到NoPadding。這樣,當填充不匹配時,您將在代碼中捕獲更多錯誤。

+0

[Here](http://android-developers.blogspot.de/2013/02/using-cryptography- to-store-credentials.html)是包含Android特定代碼的鏈接 –

+0

填充不應該用於「捕獲錯誤」,事實上報告填充錯誤給調用者是一個安全錯誤,允許填充oracle攻擊。 – zaph

+0

AES有一個塊大小:128位和三個密鑰大小:128,192和256位。任何其他Rijndael值都不是AES。 – zaph

相關問題