不使用KDC,爱丽丝和鲍勃就可以在他们之间创建一个会话密钥。这种创建会话密钥的方法就称为对称密钥协议。虽然有几种方法都可以实现这一目标,但这里我们只讨论两种最普通的方法:Diffie-Hellman 协议和站对站协议。
在Diffie-Hellman协议中,两个机构不需要使用KDC,就可以创建一个对称会话密钥。在创建对称密钥之前,这两个机构要选择两个数p和g。第一个数p,是一个有300个十进制数位(1024比特)的大的素数。第二个数g,是一个在群<Zp*
, ´>当中p - 1阶的生成元。这两个(群和生成元)都不是保密的。他们可以通过因特网发送,也可以公开。图15-9所示,就是这一过程。
, ´>当中p - 1阶的生成元。这两个(群和生成元)都不是保密的。他们可以通过因特网发送,也可以公开。图15-9所示,就是这一过程。图15-9 Diffie-Hellman方法
步骤如下:
(1) 爱丽丝选择一个大的随机数x,使得0 £ x £ p - 1,并算出R1 = gx mod p。
(2) 鲍勃选择另一个大的随机数y,使得0 £ y £ p - 1,并算出R2 = gy mod p。
(3) 爱丽丝发送R1给鲍勃。注意,爱丽丝不发送x的值,只发送R1。
(4) 鲍勃发送R2给爱丽丝。也要注意,鲍勃不发送y的值,只发送R2。
(5) 爱丽丝算出K = (R2)x mod p。
(6) 鲍勃也算出K = (R1)y mod p。
K是会话的对称密钥。
鲍勃算出了K = (R1)y mod p = (gx mod p)y mod p = gxymod p。爱丽丝算出了K = (R2)x mod p = (gy mod p)x mod = gxy mod p。鲍勃不知道x的值,爱丽丝也不知道y的值,但是两个人求出来的值是相同的。
在Diffie-Hellman方法中,对称(共享)密钥是K = gxy mod p。
我们用一个普通的例子来清楚地说明这一过程。在这个例子中,我们用小数字,但是要注意,在实际情况中,数字是非常大的。假定g = 7 和 p = 23。步骤如下:
(1) 爱丽丝选择x = 3并算出R1 = 73 mod 23 = 21。
(2) 鲍勃选择y = 6并算出R2 = 76 mod 23 = 4。
(3) 爱丽丝发送数字21给鲍勃。
(4) 鲍勃发送数字4给爱丽丝。
(5) 爱丽丝算出对称密钥K = 43 mod 23 = 18。
(6) 鲍勃算出对称密钥K = 216 mod 23 = 18。
爱丽丝的K值和鲍勃的K值是相同的:gxy mod p = 718 mod 35 = 18。
我们再给出一个更实际的例子。我们用一个程序创建一个512比特(理想位数是1024比特)的随机整数。整数p是一个159位的数。我们选择g、x和y如下所示:
p |
764624298563493572182493765955030507476338096726949748923573772860925 235666660755423637423309661180033338106194730130950414738700999178043 6548785807987581 |
g |
2 |
x |
557 |
y |
273 |
下面就表示出了R1、R2和K的值。
R1 |
844920284205665505216172947491035094143433698520012660862863631067673 619959280828586700802131859290945140217500319973312945836083821943065 966020157955354 |
R2 |
435262838709200379470747114895581627636389116262115557975123379218566 310011435718208390040181876486841753831165342691630263421106721508589 6255201288594143 |
K |
155638000664522290596225827523270765273218046944423678520320400146406 500887936651204257426776608327911017153038674561252213151610976584200 1204086433617740 |
Diffie-Hellman的概念,如图15-10所示,既简单又精密。我们可以认为爱丽丝和鲍勃之间的密钥是由三部分组成的:g, x 和 y。第一部分是公开的,人人都知道这个密钥的1/3,g是一个公开的值。另外两个部分必须要由爱丽丝和鲍勃往上加。他们每人加一部分。爱丽丝加x作为鲍勃的第二部分;鲍勃加y作为爱丽丝的第二部分。如果爱丽丝从鲍勃那里收到全密钥的2/3,她就把最后的部分,她的x,加上去完成密钥。如果鲍勃从爱丽丝那里收到全密钥的2/3,他就把最后部分,他的y,加上去完成密钥。注意,虽然爱丽丝手上的密钥由g, y 和 x组成,鲍勃手上的密钥由g, x 和y组成,但因为gxy = gyx,这两个密钥是相同的。
图15-10 Diffie-Hellman概念
也要注意,虽然两个密钥相同,因为计算是在模p中进行,爱丽丝不能求出鲍勃使用的y值;爱丽丝从鲍勃那里收到的是gy mod p,不是gy。为了要知道y的值,爱丽丝必须要用前一章中讨论过的离散对数。
Diffie-Hellman密钥交换易受两种攻击:离散对数攻击和中间相遇攻击。
离散对数攻击 密钥交换的安全性基于离散对数问题的困难性。伊夫可以拦截R1和R2。如果她能从R1 = gx mod p 求出x,从 R2 = gy mod p求出y,那么她就可以计算出对称密钥K = gxy mod p。密钥就不再是秘密了。为了使Diffie-Hellman能够抵抗离散对数攻击,推荐采取以下措施。
(1) 素数p必须要非常大(多于300个十进制数位)。
(2) 素数p的选择必须要使得p - 1具有至少一个大的素因子(多于60个十进制数位)。
(3) 生成元必须要从群<Zp*, ´ >中选择。
(4) 鲍勃和爱丽丝算出对称密钥后,必须立即销消毁x 和 y。x 和 y的值只能使用一次。
中间人攻击 该协议还有一个缺陷。伊夫不需要求出x 和 y的值,就可以攻击这个协议。她可以创建两个密钥来欺骗爱丽丝和鲍勃:一个是她和爱丽丝之间的,另一个是她和鲍勃之间的。图15-11所示,就是这种情况。
图15-11 中间相遇攻击
可能发生如下过程:
(1) 爱丽丝选择x,计算出R1 = gxmod p,并发送R1给鲍勃。
(2) 入侵者伊夫拦截R1。她选择z,计算出R2 = gz mod p,并发送R2给爱丽丝和鲍勃。
(3) 鲍勃选择y,计算出R3 = gy mod p,并发送R3给爱丽丝。R3被伊夫拦截并没有到达爱丽丝那里。
(4) 爱丽丝和伊夫算出K1 = gxz mod p,这就成为了爱丽丝和伊夫之间的共享密钥了。然而,爱丽丝却认为这是她和鲍勃之间的共享密钥。
(5) 伊夫和鲍勃计算出K2 = gzy mod p,这就是伊夫和鲍勃之间的共享密钥,然而,鲍勃认为这是他和爱丽丝之间共享的密钥。
也就是说,创建了两个密钥,而不是一个:一个是爱丽丝和伊夫之间的,一个是伊夫和鲍勃之间的。如果爱丽丝发送用K1加密的数据给鲍勃(爱丽丝和伊夫共享),那这个数据就可以被伊夫解密并读出其内容。伊夫可以发送一个用K2(伊夫和鲍勃共享)加密的信息给鲍勃,她甚至可以改变信息或干脆发送一个新的信息。鲍勃被欺骗从而相信信息是来自爱丽丝的。相似的情形也可以在另一个方向上对爱丽丝发生。
因为伊夫出现在中间,并拦截了爱丽丝发送经鲍勃的R1,以及鲍勃发送给爱丽丝的R3,这就称为中间相遇攻击(man-in-the-middle attack)。因为和一个志愿者之间依次传递水桶的队列相似,也称为水桶队列攻击(bucket brigade attack)。接下来的方法是基于Diffie-Hellman的,用验证来阻止这种攻击。
站对站密钥协定是基于Diffie-Hellman的一种方法。它使用带有公钥证书(参看后面这一部分)的数字签名,在爱丽丝和鲍勃之间建立会话密钥,如图15-12所示。
下面就是这种方法的步骤:
● 算出R1后,爱丽丝把R1发送给鲍勃(图15-12中的第一步和第二步)。
● 算出R2和会话密钥后,鲍勃把爱丽丝的ID、R1与R2连接起来。然后他用他自己的私钥为结果签名。鲍勃现在把签名、R2和他自己的公钥证书发送给爱丽丝。签名用会话密钥来加密(图15-12中的第三步、第四步和第五步)。
● 如果鲍勃的数字签名已经验证,会话密钥也已经算出,爱丽丝就把鲍勃的ID、R1与R2连接起来。然后她就用她自己的私钥在结果上签名,并发送给鲍勃。签名用会话密钥加密(图15-12中的第六步、第七步和第八步)。
● 如果爱丽丝的签名已被验证,鲍勃就把会话密钥保存起来(图15-12中的第九步)。
站对站协议避免了中间相遇攻击。拦截R1后,伊夫不能发送她自己的R2给爱丽丝,因为伊夫不能伪造鲍勃用来创建数字签名的私钥,也不能假装R2是来自鲍勃的。鲍勃的数字签名,不能用证书当中确定的鲍勃的公钥进行验证。同样,伊夫不能伪造爱丽丝的私钥来为爱丽丝发送的第三个信息签名。因为我们在本书后面将要了解到,证书是由可信的权威机构发布的,所以这些证书也是可信的。
图15-12 站对站密钥协定方法
<!-- page -->