3

这是我用来生成 DH 密钥对的代码:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH");
keyGen.initialize(1024, new SecureRandom());
KeyPair ackp = keyGen.generateKeyPair();

(当然,没有必要的 try/catch)。

我已经完成了一些迭代运行此类代码并改变密钥大小的测试(特别是从 128 以 128 步上升到 1024。1024 将是所需的大小。

首先,运行每个大小生成 10 次以使结果的标准偏差最小,这会产生很大的结果波动,平均而言,创建密钥(1024 位)所需的时间是:683027ms,四舍五入创建密钥需要11 分钟

问题是:

  1. 其他人得到相同的结果吗?
  2. 是否需要进行一些优化以缩短时间?
  3. 高波动取决于什么?(即生成 1024 位密钥可能需要 18 秒到 30 分钟...)

已在 Nexus-One 手机上运行测试

提前感谢您对“问题”有所了解

问候

4

1 回答 1

7

我做了一些进一步的编码/研究,显然最耗时的通话(电池?)是:

new SecureRandom()

但特别是,由于对于 DH 参数 (g, p, l) 可以预先计算和硬编码,因此明智的建议是事先这样做并使用生成的值来生成密钥对(这几乎是瞬时的)。

示例代码:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH");
keyGen.initialize(new DHParameterSpec(p, g, l));
KeyPair ackp = keyGen.generateKeyPair();

其中 p、g 和 l 是:

final BigInteger p = new BigInteger("X");
final BigInteger g = new BigInteger("Y");
final int l = 1023;

X 和 Y 可以通过以下方式离线生成:

AlgorithmParameterGenerator paramGen = AlgorithmParameterGenerator.getInstance("DH");
paramGen.init(1024, new SecureRandom());
AlgorithmParameters params = paramGen.generateParameters();
DHParameterSpec dhSpec = (DHParameterSpec)params.getParameterSpec(DHParameterSpec.class);
System.out.println("p: " + dhSpec.getP() + "\ng: " + dhSpec.getG() + " \nl: " + dhSpec.getL());
于 2010-03-24T17:54:00.907 回答