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总是抽风啊。
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:changming 来源: changming的blog
- 标签: Diffie-Hellman
- 发布时间:2012-06-14 13:55:21
- [54] IOS安全–浅谈关于IOS加固的几种方法
- [54] android 开发入门
- [52] Oracle MTS模式下 进程地址与会话信
- [52] 图书馆的世界纪录
- [51] Go Reflect 性能
- [50] 如何拿下简短的域名
- [48] 【社会化设计】自我(self)部分――欢迎区
- [48] 读书笔记-壹百度:百度十年千倍的29条法则
- [38] 程序员技术练级攻略
- [31] 视觉调整-设计师 vs. 逻辑