Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Diffie-Hellman公共参数在每次执行时都是相同的?_Java_Cryptography_Diffie Hellman - Fatal编程技术网

Java 为什么Diffie-Hellman公共参数在每次执行时都是相同的?

Java 为什么Diffie-Hellman公共参数在每次执行时都是相同的?,java,cryptography,diffie-hellman,Java,Cryptography,Diffie Hellman,我正在尝试实现Diffie-Hellman密钥交换协议。目前,我正忙于生成公共参数。 每次我运行程序时,p和g参数都是相同的(尽管方法文档中说“每次调用它时都会生成一个新的密钥对”) 有人能给我解释一下我错过了什么吗 KeyPairGenerator kpg; try { kpg = KeyPairGenerator.getInstance("DiffieHellman"); kpg.initialize(512, new SecureRandom()); KeyPai

我正在尝试实现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();
}

您没有显式初始化Diffie-Hellman交换的
p
g
值,因此它们被初始化为默认值。请注意,这些价值观是公开的,必须在双方之间共享,以使交换正常工作。我遇到了一个死胡同,但由于您没有自己设置参数,代码正在检索用于DSA的相同默认值
p
g
,并将它们应用于DH

:

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

列出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

Java平台实现只需要实现具有1024个密钥大小的DiffieHellman。虽然这在实现中几乎没有什么不同,但是您是否可以尝试使用1024的密钥大小进行初始化,看看会发生什么?同时尽量不要调用initialize(它将使用默认初始化)