2014-01-09 4 views
3

Я пытаюсь реализовать протокол обмена ключами Диффи Хеллмана. На данный момент я зациклился на генерации общих параметров.
Каждый раз, когда я запускаю программу, параметры 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 требуется только для реализации DiffieHellman с 1024 ключевых размеров. Хотя это практически не влияет на реализацию, можете ли вы попытаться инициализировать с размером ключа 1024 и посмотреть, что произойдет? Также попробуйте не вызывать инициализацию вообще (она будет использовать инициализацию по умолчанию) – SirRichie

ответ

3

Вы явно не инициализируются значения p и g для обмена Диффи-Хеллмана, и поэтому они инициализируются значениями по умолчанию. Обратите внимание, что эти значения являются общедоступными и должны быть разделены между двумя сторонами, чтобы обмен работал правильно. Я столкнулся с тупиком after the third SPI in the Sun JCE, но поскольку вы сами не задаете параметры, код извлекает одинаковые значения по умолчанию p и g, которые используются для DSA и применяют их к DH.

From the Javadoc:

В случае, если клиент не явно инициализировать 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