2010-03-18 52 views
3

這是我用來生成密鑰對DH代碼:DH密鑰對生成時間在Android

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH"); 
keyGen.initialize(1024, new SecureRandom()); 
KeyPair ackp = keyGen.generateKeyPair(); 

(不包括所需要的try/catch語句,當然)。

我已經做了反覆運行這樣的代碼,並用128步改變密鑰大小(從128特別斜坡最高達1024。1024一些測試將所需的大小。

首先,運行無論如何,創建密鑰(1024位)所需的時間平均爲:683027毫​​秒,其總和爲約11分鐘創建密鑰

問題是:

  1. 其他人是否得到相同的結果?
  2. 是否有一些優化運行,以實現更低的時間?
  3. 什麼是高波動依賴? (即用於生成1024位密鑰可能需要18秒至30分鐘...)

測試已經在Nexus-One手機上提前對脫落一些輕運行

感謝「問題」

問候

回答

7

我做了一些進一步的編碼/研究,顯然通話,這是最時間(電池?)消費是:

new SecureRandom() 

特別是,因爲對於DH,參數(g,p,l)可以預先計算並且硬編碼,所以事先這樣做是明智的建議,並且使用生成的值來生成密鑰對幾乎是瞬間的)。

示例代碼:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH"); 
keyGen.initialize(new DHParameterSpec(p, g, l)); 
KeyPair ackp = keyGen.generateKeyPair(); 

其中P,G,和l是:

final BigInteger p = new BigInteger("X"); 
final BigInteger g = new BigInteger("Y"); 
final int l = 1023; 

且X和Y可以脫機生成:

AlgorithmParameterGenerator paramGen = AlgorithmParameterGenerator.getInstance("DH"); 
paramGen.init(1024, new SecureRandom()); 
AlgorithmParameters params = paramGen.generateParameters(); 
DHParameterSpec dhSpec = (DHParameterSpec)params.getParameterSpec(DHParameterSpec.class); 
System.out.println("p: " + dhSpec.getP() + "\ng: " + dhSpec.getG() + " \nl: " + dhSpec.getL()); 
+0

如果生成密鑰像這樣,它不會讓你的數據比純文本更安全。 – Behrooz 2012-12-16 15:46:21

+0

我知道它有點晚了,但是因爲Behrooz指出的原因,我有一個倒退。隨機性對於安全至關重要,如果你想要安全,重用不是一種選擇。與時機的實際問題可能指向您的Android設備如何收集熵的一些問題,這聽起來像與我的平臺的問題。 – 2013-02-04 00:59:58

+10

我認爲前兩個評論是不正確的。參數* p *和* g *在Diffie-Hellman中完全公開;它們用於在調用'generateKeyPair'時生成私有信息。您可以在[Wikipedia](http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange#Public_Key)以及「知名組織」列表中看到此內容,這些列表是「推薦值* p *和* g *,例如, [RFC2539](http://tools.ietf.org/html/rfc2539#appendix-A)和[RFC3526](http://tools.ietf.org/html/rfc3526)。 – 2013-07-01 16:20:18