这是我用来生成DH密钥对的代码:
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH");
keyGen.initialize(1024, new SecureRandom());
KeyPair ackp = keyGen.generateKeyPair();
(当然没有所需的try / catch)。
我已经完成了一些迭代运行这些代码并改变密钥大小的测试(特别是从128步增加到1024步.1024将是所需的大小。
首先,运行每个大小生成10次以使结果具有一些最小的std偏差会导致结果的高波动,无论如何,创建密钥所需的时间( 1024位 )是:683027ms,用于创建密钥的时间大约为 11分钟。
问题是:
已在Nexus-One手机上进行测试
提前感谢您对“问题”有所了解
此致
答案 0 :(得分: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());