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

VGe*_*rge 1 java bouncycastle diffie-hellman

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

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

谢谢你的时间!

MK.*_*MK. 6

我想这个例子的一部分

private static BigInteger g512 = new BigInteger("1234567890", 16);
private static BigInteger p512 = new BigInteger("1234567890", 16);
Run Code Online (Sandbox Code Playgroud)

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

基本上DH交换的有趣输入是p,g需要生成的()对,并且必须具有一些独特的属性.显然,上面的例子只显示了占位符值,这些值不会产生正确运行的算法(p不能等于gp应该是素数,而在示例中它显然可以被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();
...
Run Code Online (Sandbox Code Playgroud)

  • 我也不确定为什么要投票.你对前面的例子是正确的.FWIW您链接的那个确实有用.因为链接往往会随着时间的推移而中断,所以我添加了相关的代码片段.(希望你不要介意). (2认同)