我正在尝试实现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();
}
答案 0 :(得分:3)
您没有明确初始化Diffie-Hellman交换的p
和g
值,因此它们被初始化为默认值。请注意,这些值是公开的,必须在双方之间共享才能使交换正常工作。我遇到了死胡同after the third SPI in the Sun JCE,但由于您没有自己设置参数,因此代码检索用于DSA的相同默认p
和g
并将其应用于DH。
如果客户端未显式初始化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