1

我遇到了 Diffie Hellman 实施的问题。我正在使用此代码 http://www.java2s.com/Tutorial/Java/0490__Security/DiffieHellmanKeyAgreement.htm

这实际上是我正在阅读的一本书的一个例子。但我不明白为什么要generateSecret()为每个KeyAgreement. 我注意到该函数会创建不同的键,即使我用相同的KeyAgreement两次调用它!如果有人有什么建议我会很高兴的!

谢谢你的时间!

4

1 回答 1

6

我认为示例的一部分

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

完全是假的。 p需要是素数并且g需要是生成器。当我尝试运行该示例时,出现异常。 似乎是一个更合理的例子(但我自己还没有测试过)。

基本上,DH 交换的有趣输入是p,g需要生成并且必须具有一些独特属性的 ( ) 对。显然,上面的示例仅显示了不会产生正确运行的算法的占位符值(p不能等于g并且p应该是素数,而在示例中它显然可以被 10 整除)。我链接到的示例显示了如何使用库来生成正确的 ( p, g) 对。

还值得注意的是,DH 参数生成通常是与生成密钥分开的步骤。虽然 DH 参数有些私密,但它们不像您的私钥那样敏感,可以生成一次然后重复使用。

(编辑:示例

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();
...
于 2012-06-05T18:28:43.750 回答