IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Diffie-Hellman算法的效率

changming的blog 2012-06-14 13:55:21 累计浏览 1,363 次
本机暂存

    我之前一直有个误解,以为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总是抽风啊。

同分类推荐文章

  1. 对基本有序的序列排序算法 (2026-06-11 17:46:49)
  2. Four Levels Of Customer Understanding (2026-05-22 21:00:00)
  3. 除法的意义 (2026-04-12 20:52:17)

查看更多 算法 文章 →

建议继续学习

  1. md5到md5破解的一些科普 (累计阅读 6,479)
  2. Java程序员必知的8大排序算法 (累计阅读 5,739)
  3. 开源压缩算法Zopfli介绍 (累计阅读 4,555)
  4. 跨越千年的RSA算法 (累计阅读 4,348)
  5. 数论的应用-RSA公钥算法 (累计阅读 4,071)
  6. 寄存器分配初探–问题描述( Register Allocation – The Problem ) (累计阅读 3,945)
  7. TCP SYN-Cookie背后的人和事 - 续 (累计阅读 3,855)
  8. 密码学及公钥基础设施入门 (累计阅读 2,801)
  9. 位运算技巧整理 (累计阅读 2,746)
  10. RSA 算法是如何诞生的 (累计阅读 2,717)