为什么每次执行时Diffie Hellman公共参数都相同?

时间:2014-01-09 11:47:31

标签: java cryptography diffie-hellman

我正在尝试实现Diffie Hellman密钥交换协议。目前我被困在公共参数生成中 每次运行程序时,p和g参数都是相同的(尽管方法文档说“每次调用它时都会生成一个新的密钥对。”)。

可以请某人向我解释我在这里失踪了什么?

KeyPairGenerator kpg;
try 
{
    kpg = KeyPairGenerator.getInstance("DiffieHellman");
    kpg.initialize(512, new SecureRandom());
    KeyPair dkp = kpg.generateKeyPair();

    DHParameterSpec params = 
            ((javax.crypto.interfaces.DHPublicKey) dkp.getPublic()).getParams();
    BigInteger p = params.getP();
    BigInteger a = params.getG();
    System.out.println(p);

} catch (Exception e) 
{
    e.printStackTrace();
}

1 个答案:

答案 0 :(得分:3)

您没有明确初始化Diffie-Hellman交换的pg值,因此它们被初始化为默认值。请注意,这些值是公开的,必须在双方之间共享才能使交换正常工作。我遇到了死胡同after the third SPI in the Sun JCE,但由于您没有自己设置参数,因此代码检索用于DSA的相同默认pg并将其应用于DH。

From the Javadoc

  

如果客户端未显式初始化AlgorithmParameterGenerator(通过调用init方法),则每个提供程序必须提供(并记录)默认初始化。例如,Sun提供程序使用1024位的默认模数素数来生成DSA参数。

The documentation for the Sun implementation列出了512位密钥的以下值:

p = fca682ce 8e12caba 26efccf7 110e526d b078b05e decbcd1e b4a208f3
    ae1617ae 01f35b91 a47e6df6 3413c5e1 2ed0899b cd132acd 50d99151
    bdc43ee7 37592e17
g = 678471b2 7a9cf44e e91a49c5 147db1a9 aaf244f0 5a434d64 86931d2d
    14271b9e 35030b71 fd73da17 9069b32e 2935630e 1c206235 4d0da20a
    6c416e50 be794ca4