Java 为什么Diffie-Hellman公共参数在每次执行时都是相同的?
我正在尝试实现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
每次我运行程序时,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(它将使用默认初始化)