Android上的DH Keypair生成时间

clo*_*oud 3 time android nexus-one diffie-hellman

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

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH");
keyGen.initialize(1024, new SecureRandom());
KeyPair ackp = keyGen.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)

(当然没有必要的尝试/捕获).

我已经做了一些测试,迭代地运行这些代码并改变密钥大小(特别是从128步增加到128步到1024. 1024将是所需的大小.

首先,运行每个大小生成10次以使结果具有一些最小的std偏差会导致结果的高波动,平均而言,创建密钥(1024位)所需的时间是:683027ms,其向上舍入到周围创建密钥需要11分钟.

问题是:

  1. 有没有人得到相同的结果?
  2. 为了实现更低的时间,是否需要进行一些优化?
  3. 什么是高波动依赖?(即生成1024位密钥,可能需要18秒到30分钟...)

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

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

问候

clo*_*oud 7

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

new SecureRandom()
Run Code Online (Sandbox Code Playgroud)

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

示例代码:

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

其中p,g和l是:

final BigInteger p = new BigInteger("X");
final BigInteger g = new BigInteger("Y");
final int l = 1023;
Run Code Online (Sandbox Code Playgroud)

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());
Run Code Online (Sandbox Code Playgroud)

  • 我认为前两条评论不正确.参数*p*和*g*在Diffie-Hellman中完全公开; 它们用于在对"generateKeyPair"的调用中生成私有信息.你可以在[维基百科](http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange#Public_Key)以及"知名团体"列表中看到这些,这些是*的推荐值p*和*g*,例如[RFC2539](http://tools.ietf.org/html/rfc2539#appendix-A)和[RFC3526](http://tools.ietf.org/html/rfc3526) ). (11认同)