2010-03-18 129 views
3

这是我用来生成密钥对DH代码:DH密钥对生成时间在Android

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

(不包括所需要的try/catch语句,当然)。

我已经做了反复运行这样的代码,并用128步改变密钥大小(从128特别斜坡最高达1024。1024一些测试将所需的大小。

首先,运行无论如何,创建密钥(1024位)所需的时间平均为:683027毫​​秒,其总和为约11分钟创建密钥

问题是:

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

测试已经在Nexus-One手机上提前对脱落一些轻运行

感谢“问题”

问候

回答

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()); 
+0

如果生成密钥像这样,它不会让你的数据比纯文本更安全。 – Behrooz 2012-12-16 15:46:21

+0

我知道它有点晚了,但是因为Behrooz指出的原因,我有一个倒退。随机性对于安全至关重要,如果你想要安全,重用不是一种选择。与时机的实际问题可能指向您的Android设备如何收集熵的一些问题,这听起来像与我的平台的问题。 – 2013-02-04 00:59:58

+10

我认为前两个评论是不正确的。参数* p *和* g *在Diffie-Hellman中完全公开;它们用于在调用'generateKeyPair'时生成私有信息。您可以在[Wikipedia](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)。 – 2013-07-01 16:20:18