2012-06-05 3 views
1

У меня возникла проблема с реализацией Diffie Hellman. Я использую этот код http://www.java2s.com/Tutorial/Java/0490__Security/DiffieHellmanKeyAgreement.htmDiffie Hellman ключевое соглашение генерирует разные ключи каждый раз JAVA

Это на самом деле пример из одной книги, которую я читаю. Но я не могу понять, почему generateSecret() создает другой ключ для каждого KeyAgreement. Я заметил, что функция создает разные клавиши, даже если я назову ее одним и тем же KeyAgreement дважды! Если у кого-то есть что предложить, я буду очень рад!

Спасибо за ваше время!

+0

Я думаю, что generateSecret сбрасывает состояние KeyAgreement, возможно, именно поэтому? Кроме того, ваш вопрос не на 100% ясен, опубликуйте лучшее с выходом, показывающим, что отличает и при каких обстоятельствах. –

+0

Прежде всего, спасибо за ваше время! Теперь о проблеме, я прочитал страницу api для KeyAgreement, и он говорит, что, если вы не заново заново запустите keyagreement, он использует те же ключи. Я использовал код по ссылке, единственная разница в том, что я не хеширую результат i я просто печатаю его так: «System.out.println (aKeyAgree.generateSecret()); System.out.println (bKeyAgree.generateSecret()); Я просто запускаю код, и у меня разные результаты, и это не нормально, как говорит книга! – VGe0rge

+0

Можете ли вы разместить свой код? – user845279

ответ

6

Я думаю, что часть примера

private static BigInteger g512 = new BigInteger("1234567890", 16); 
private static BigInteger p512 = new BigInteger("1234567890", 16); 

полностью поддельная. p должен быть простым, а g должен быть генератором. Когда я пытаюсь запустить пример, я получаю исключение. This представляется более разумным примером (но я еще не тестировал его сам).

В принципе интересный вход для обмена DH заключается в том, что пара (p,g) должна быть сгенерирована и должна обладать некоторыми уникальными свойствами. Очевидно, что приведенный выше пример показывает только значения держателя места, которые не будут генерировать правильно функционирующий алгоритм (p не может быть равен g, а p должен быть простым, а в примере он явно делится на 10). В приведенном примере я расскажу, как использовать библиотеки для создания правильной пары (p, g).

Следует также отметить, что генерация параметров DH обычно является отдельным шагом от генерирования секретного ключа. Хотя параметры DH несколько конфиденциальны, они не так чувствительны, как ваш личный ключ, и могут генерироваться один раз, а затем повторно использоваться.

(Edit: Example)

AlgorithmParameterGenerator paramGen = AlgorithmParameterGenerator.getInstance("DH"); 
paramGen.init(512); // number of bits 
AlgorithmParameters params = paramGen.generateParameters(); 
DHParameterSpec dhSpec = params.getParameterSpec(DHParameterSpec.class); 

BigInteger p512 = dhSpec.getP(); 
BigInteger g512 = dhSpec.getG(); 
int l = dhSpec.getL(); 
... 
+1

? на основе чего? –

+2

Я также не знаю, почему и голос. Вы правы в более раннем примере. FWIW работает тот, который вы связали. Поскольку ссылки имеют тенденцию прерываться со временем, я добавил соответствующий фрагмент кода. (Надеюсь, вы не возражаете). – Leigh

+0

Извините за поздний ответ, я прекратил работать над этим проектом с тех пор, но я скоро начну снова :) Спасибо за ответ, я не проголосовал за вас! На самом деле, я только что проголосовал за вас сейчас, и когда я проверю ваш код, я дам вам принятый ответ! – VGe0rge