2014-01-09 56 views
3

我正在嘗試實施Diffie Hellman密鑰交換協議。目前我被困在公共參數世代。
每次運行該程序時,p和g參數都是相同的(儘管方法文檔中提到「這將在每次調用時生成一個新的密鑰對」)。爲什麼Diffie Hellman公共參數在每次執行時都相同?

可以請別人向我解釋我在這裏錯過了什麼?

KeyPairGenerator kpg; 
try 
{ 
    kpg = KeyPairGenerator.getInstance("DiffieHellman"); 
    kpg.initialize(512, new SecureRandom()); 
    KeyPair dkp = kpg.generateKeyPair(); 

    DHParameterSpec params = 
      ((javax.crypto.interfaces.DHPublicKey) dkp.getPublic()).getParams(); 
    BigInteger p = params.getP(); 
    BigInteger a = params.getG(); 
    System.out.println(p); 

} catch (Exception e) 
{ 
    e.printStackTrace(); 
} 
+0

Java平臺的實現只需要1024塊的密鑰大小來實現DiffieHellman。雖然這在實現中幾乎沒有區別,但是您是否可以嘗試使用1024的密鑰大小進行初始化,然後查看會發生什麼?也儘量不要調用初始化(它會使用默認的初始化) – SirRichie

回答

3

你沒有明確初始化pg值的Diffie-Hellman交換,所以他們被初始化爲默認值。請注意,這些值是公開的,必須在雙方之間共享才能使交換正常工作。我碰到了一個死衚衕after the third SPI in the Sun JCE,但由於您不是自己設置參數,因此代碼將檢索用於DSA並將它們應用於DH的相同默認pg

From the Javadoc

如果客戶端不(通過到一個init方法的調用)顯式初始化AlgorithmParameterGenerator,每個提供者必須提供(和記錄)默認的初始化。例如,Sun提供程序使用1024位的默認模數素數大小來生成DSA參數。

The documentation for the Sun implementation列出了512位密鑰以下值:

p = fca682ce 8e12caba 26efccf7 110e526d b078b05e decbcd1e b4a208f3 
    ae1617ae 01f35b91 a47e6df6 3413c5e1 2ed0899b cd132acd 50d99151 
    bdc43ee7 37592e17 
g = 678471b2 7a9cf44e e91a49c5 147db1a9 aaf244f0 5a434d64 86931d2d 
    14271b9e 35030b71 fd73da17 9069b32e 2935630e 1c206235 4d0da20a 
    6c416e50 be794ca4 
相關問題