Diffie Hellman密钥协议每次都会生成不同的密钥JAVA

时间:2012-06-05 03:17:06

标签: java bouncycastle diffie-hellman

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

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

感谢您的时间!

1 个答案:

答案 0 :(得分:6)

我认为示例中的部分

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

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

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

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

(编辑: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();
...