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
- [12] 产品设计之QQ邮箱登录页与淘宝登录页
- [9] Python连接 MySQL 数据库的超时问
- [9] 分布式系统的事务处理
- [8] 读书:谣言
- [8] 移动Web开发初学者指南
- [8] 逃出你的肖申克(五):看不见的牢笼(上)
- [8] 关于不得不在python中使用代理访问网络的
- [8] 浅述各平台系统交互设计的不同关注点
- [7] 微信朋友圈技术之道
- [7] 可用性测试好助手——Morae软件的应用