非对称算法-密钥磋商算法-DH (2012-01-05 13:37:16)
http://blog.sina.com.cn/s/blog_55a9111c0100ystz.html
http://blog.sina.com.cn/s/blog_55a9111c0100ystz.html
http://blog.sina.com.cn/s/blog_55a9111c0100ystz.html
转载
▼
标签: 杂谈 | 分类: 密码安全 |
正文开始
2. DH,首个公开发表的公用密钥算法,是密钥磋商算法,而不是密钥交换算法(这一点要注意,与RSA传输密钥的实现不一样),也不能实现加密和数字签名,密钥不是由一方发送给另外一方,而是双方共同产生的一个密钥。
发送与接收双方共同拥有这个密钥对。要想计算出磋商后的密钥:
1)发送方:发送方的私钥+接收方的公钥计算
2)接收方:接收方的私钥+发送方的公钥计算
DH公钥常被称作份额(share),DH也使用模幂(这个在非对称算法中基本上都跑不掉)。
基本原理:
1) 但是模数和RSA中的e可以任取不一样,DH的模数一定要是个大素数(通常被称做p),这个模数也是公开的
2) 除了这个数字双方还需要共享另一个数字称为g(发生器)。因为g要满足:g^w mod p =Z的值W。因此g能产生从1到p-1的所有数字。所以有1<p<g
3) 发送方随机产生一个大整数x, 计算GX=G^X mod P。(X需要保密)
4) 接收方随机产生一个大整数y, 计算 GY=G^Y mod P. (Y需要保密)
5) 发送方把GX发送给接收方,接收方把GY发送给发送方
6) 发送方计算:ZZ(密钥) = GY ^ X mod P
7) 接收方计算:ZZ(密钥) = GX ^ Y mod P
举个简单的例子:
1) p=3, g=11
2) 发送方随机产生一个大整数x=5,计算GX=11^5 mod 3 = 2
3) 接收方随机产生一个大整数y=7,计算GY=11^7 mod 3 = 2
4) 发送方计算:ZZ(密钥) = 2 ^ 5 mod 3 = 2
5) 接收方计算:ZZ(密钥) = 2 ^ 7 mod 3 = 2
这里面p取的值比较小,所以可能不太直观………
证明公式:
ZZ=GY^X mod p = ((g^Y mod p ) ^X) mod p
= ((g^Y)^X) mod p (根据取模运算规则得到)
= (g ^Y^X) mod p = ((g^X)^Y) mod p
= (((g^X) mod p)^Y) mod p
= GX^Y mod p
安全性分析:
目前还没有办法证明攻击都无法计算得出ZZ,普遍认为要想做到这一点要求同时拥有x和Gy或者y和Gx非常难。DH的计算公式都是单向函数,其逆运算就是求解离散对数问题,当前还没有高效计算离散对数的方法。
DH相比RSA,NB的地方在于RSA有一端需要对方的公钥都能继续,而DH一开始共享p和g,DH的算法的安全性基于p的大小以及x的大小。BTW:DH中X的选择与对称算法的相关性联系比较多,如果X选择太小,产生的ZZ太短,对于位数比较长的对称算法(如3DES,AES256)来说,这个密钥就比较弱了。
不足之处:
1)没有提供通信双方的身份信息,所以不能鉴别双方身份,容易遭受中间人攻击。
2)是密集型计算,容易遭受拒绝服务攻击,即攻击者请求大量密钥,被攻击者花费大量计算资源求解无用的幂系数。
3)无法防止重放攻击。
不过在很多情况下,DH会和一种签名算法如DSS,RSA一起组合使用来防止中间人攻击。