Diffie-Hellman算法的效率

我之前一直有个误解,以为DH的私钥的长度必须跟公钥一样。

今天调试flash的时候发现,它的DH算法用的私钥长度竟然是128位,虽然它采用的同余群的p是1024位的。我然后翻了些资料,看DH算法对私钥的长度有何要求。从Sun JDK的代码来看,对私钥x只有一个要求,1 <= x <= p-2,那么也就是说只要它的长度小于1024就没有问题。

BigInteger pMinus2 = p.subtract(BigInteger.valueOf(2)); 
do {
    // generate random x up to 2^lSize bits long
    x = new BigInteger(lSize, random);
} while ((x.compareTo(BigInteger.ONE) < 0) ||((x.compareTo(pMinus2) > 0)));

其中无论是生KeyPair,还是计算secret,其中最耗时的无非是大整数的次幂再求余的运算,即BigInteger的modPow。

我想拿google的caliper测试一下DH的性能,结果,当private key的长度稍微大一点的时候,caliper就不干了,说Got no response。

1 of 2 measurements complete: 50.0%.java.lang.RuntimeException: Got no response!
at com.google.caliper.runner.CaliperRun.measure(CaliperRun.java:234)
at com.google.caliper.runner.CaliperRun.run(CaliperRun.java:132)
at com.google.caliper.runner.CaliperMain.exitlessMain(CaliperMain.java:88)
at com.google.caliper.runner.CaliperMain.main(CaliperMain.java:58)
at com.google.caliper.runner.CaliperMain.main(CaliperMain.java:47)

可能是因为运行的时间太长了,于是我就自己写代码测,结果是,当private key长度等于128位的时候,在我的笔记本上每次生keypair或者计算secret所需要的时间大约是3ms左右。而当key长度等于1024位的时候,这个值则增长到22ms左右。l的默认值是384,那么大约是9ms左右,也就是说1个CPU 1秒钟最多只能建立50个连接。不过我的笔记本比较老,拿到公司的服务器上去试一试也许不一样,可能会好3-4倍。

Caliper的那个问题依然没解决,我在配置文件中找遍了所有选项也没有找到解决办法。求达人指点。另外,能不能在自己的server上跑那个webapp,而不是在GAE上面?因为GAE总是抽风啊。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥