2012-04-20 349 views
4

AES密鑰可以由這個代碼生成是AES密鑰隨機?

KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
kgen.init(128); 

如果我有生成隨機數,我可以用它以這樣一種方式的「非常可靠」的方式

SecureRandom rnd = new SecureRandom(); 
byte[] key = new byte[16]; 
rnd.nextBytes(key); 

這種方法獲得的關鍵是可靠的嗎?

或只必須用一些特殊的算法

+2

你的問題很混亂。你能否以更清晰的方式重申你想要問的問題? – 2012-04-20 19:35:04

+0

同意脫節動詞名詞不要 – 2012-04-20 19:41:25

+1

[Java 256位AES密碼加密](http://stackoverflow.com/questions/992019/java-256-bit-aes-password-based-encryption) 。 – kba 2012-04-20 19:45:50

回答

1

生成您可以添加使用SecureRandom隨機算法:

KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
    SecureRandom random = new SecureRandom(); // cryptograph. secure random 
    keyGen.init(random); 
    SecretKey secretKey = keyGen.generateKey(); 
11

AES密鑰可以是任何128位。它應該實際上是無法猜測的,無論創建它的方法。

例如:

SecureRandom sr = new SecureRandom() 

key = new byte[16]; 
iv = new byte[16]; 

sr.nextBytes(key); 
sr.nextBytes(iv); 

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key,"AES"), new IvParameterSpec(IV)); 

SecretKeySpec,順便說一下,只是圍繞字節[]瘦包裝---它不以任意方式變換的關鍵。沒有「特殊算法」。

+0

這是我想聽到的,我希望這是真的:) – user249654 2012-04-20 20:16:40

+1

@ user249654是的。不要像問題那樣使用普通的'java.util.Random',至少應該使用像SecureRandom這樣的方法來避免快速強制你的密鑰。 – 2012-04-21 14:00:03

+0

@PaŭloEbermann請同時參閱Thomas的[這個出色的問題](http://stackoverflow.com/q/18228579/589259)。這是安全的並不一定意味着它是生成密鑰的最佳方法。 – 2013-08-14 12:32:31

1

聽起來好像你正試圖根據密碼生成AES密鑰。

如果是這種情況,可以使用javax.crypto.SecretKeyFactory的generateSecret方法,傳入一個javax.crypto.spec.PBEKeySpec作爲參數。 PBEKeySpec允許將密碼指定爲其構造函數的參數。

+0

是的,但我不像PBEKeySpec :) – user249654 2012-04-20 20:05:21

+0

爲什麼? 「PBEKeySpec」有什麼問題? – 2012-04-20 20:08:16

+0

我不知道什麼PBEKeySpec做(在它)?:) – user249654 2012-04-20 20:14:55

3

要添加到其他的答案......我認爲,基本的隨機函數是不安全的原因有兩方面的原因:

  1. 輕微的統計偏差是對於非安全相關的情況尚可,但是對於安全應用程序而言,這種分佈的範圍很窄,無法接受。
  2. 它們由系統DATETIME播種。即使知道您生成密鑰的時間(精確度爲+/- 6個月),也會大大降低蠻力搜索空間。
+1

請注意,這個答案是在問題從「Random」改爲「SecureRandom」之前提供的*,這在我看來是作弊的。 – 2013-08-14 12:30:12