Я думаю, что часть примера
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();
...
Я думаю, что generateSecret сбрасывает состояние KeyAgreement, возможно, именно поэтому? Кроме того, ваш вопрос не на 100% ясен, опубликуйте лучшее с выходом, показывающим, что отличает и при каких обстоятельствах. –
Прежде всего, спасибо за ваше время! Теперь о проблеме, я прочитал страницу api для KeyAgreement, и он говорит, что, если вы не заново заново запустите keyagreement, он использует те же ключи. Я использовал код по ссылке, единственная разница в том, что я не хеширую результат i я просто печатаю его так: «System.out.println (aKeyAgree.generateSecret()); System.out.println (bKeyAgree.generateSecret()); Я просто запускаю код, и у меня разные результаты, и это не нормально, как говорит книга! – VGe0rge
Можете ли вы разместить свой код? – user845279