第三章  基本协议

3.1 密钥交换

    通常的密码技术是用单独的密钥对每一次单独的会话加密,这个密钥称为会话密钥,因为它只在一次特殊的通信中使用。正如8.5节讨论的一样,会话密钥只用于通信期间。这个会话密钥怎么到达会话者的手中可能是很复杂的事情。

    对称密码的密钥交换

    这个协议假设Alice和Bob(网络上的用户)每人和密钥分配中心(KDC)共享一个秘密密钥[1260],我们的协议中的Trent就是KDC。在协议开始执行前,这些密钥必须在适当的位置(协议忽略了怎么分配这些秘密密钥这个非常实际的问题,只是假设它们在适当的位置,并且Mallory不知道它们是什么)。

    (1)Alice呼叫Trent,并请求一个与Bob通信的会话密钥。

    (2)Trent产生一随机会话密钥,并对它的两个副本加密:一个用Alice的密钥,另一个用Bob的密钥加密。Trent发送这两个副本给Alice。

    (3)Alice对她的会话密钥的副本解密。

    (4)Alice将Bob的会话密钥副本送给Bob。

    (5)Bob对他的会话密钥的副本解密。

    (6)Alice和Bob用这个会话密钥安全地通信。

    这个协议依赖于Trent的绝对安全性。Trent更可能是可信的计算机程序,而不是可信的个人。如果Mallory破坏了Trent,整个网络都会遭受损害。他有Trent与每个用户共享的所有秘密密钥;他可以读所有过去和将来的通信业务。他所做的事情就是对通信线路进行搭线窃听,并监视加密的报文业务。

    这个系统的另外一个问题是Trent可能会成为瓶颈。他必须参与每一次密钥交换,如果Trent失败了,这个系统就会被破坏。

    公开密钥密码的密钥交换

    基础的混合密码体制曾在2.5节中讨论过。Alice和Bob使用公开密钥密码协商会话密钥,并用协商的会话密钥加密数据。在一些实际的实现中,Alice和Bob签了名的公开密钥可在数据库中获得。这使得密钥交换协议更容易,即使Bob从来没有听说过Alice,Alice也能够把信息安全地发送给Bob。

    (1)Alice从KDC得到Bob的公开密钥。

    (2)Alice产生随机会话密钥,用Bob的公开密钥加密它,然后将它传给Bob。

    (3)Bob用他的私钥解密Alice的信息。

    (4)他们两人用同一会话密钥对他们的通信进行加密。

    中间人攻击

    Eve除了试图破译公开密钥算法或者尝试对密文作唯密文攻击之外,没有更好的办法。Mallory比Eve更有能力,他不仅能监听Alice和Bob之间的信息、还能修改信息、删除信息、并能产生全新的信息。当Mallory同Alice谈话时,他能模仿Bob,他也能模仿Alice同Bob谈话。下面要谈的是这种攻击怎样生效的:

    (1)Alice将她的公开密钥传送给Bob。Mallory截取了这个密钥并将自己的公开密钥传送给Bob。

    (2)Bob将他的公开密钥传送给Alice。Mallory截取这个密钥,并将自己的公开密钥传送给Alice。

    (3)当Alice将用“Bob”的公开密钥加了密的信息传送给Bob时,Mallory截取它。由于信息实际上是用Mallory的公开密钥加密的,他就用自己的私钥解密。再用Bob的公开密钥对信息重新加密,并将它传送给Bob。

    (4)当Bob将用“Alice”的公开密钥加密的信息传送给Alice时,Mallory截取它。由于信息实际上是用他自己的公开密钥加密的,他用他的私钥解密信息,再用Alice的公开密钥重新加密,并将它传送给Alice。

    即使Alice和Bob的公开密钥存储在数据库中,这种攻击也是可行的。Mallory能够截取Alice的数据库查询,并用自己的公开密钥代替Bob的公开密钥,对Bob他也能做同样的事情,用自己的公开密钥代替Alice的公开密钥。他也能秘密地侵入数据库,用他自己的密钥代替Alice和Bob的密钥。接下来他就简单地等着Alice和Bob互相谈话,然后截取和修改信息,他成功了!

    “中间人攻击”是可行的,因为Alice和Bob无法验证他们正在作的互相交谈。假设Mallory没有导致任何值得注意的网络延迟,他们两人就没有办法知道有人正在他们中间阅读他们自认为是秘密的消息。

    联锁协议

    由Ron Rivest和Adi Shamir[1327]发明的联锁协议是阻止“中间人攻击”的好办法。下面是这个协议怎么工作的:

    (1)Alice将她的公开密钥传送给Bob。

    (2)Bob将他的公开密钥传送给Alice。

    (3)Alice用Bob的公开密钥加密她的报文,并将加密报文的一半传送给Bob。

    (4)Bob用Alice的公开密钥加密他的报文,并将加密报文的一半传送给Alice。

    (5)Alice将加了密的另一半报文传送给Bob。

    (6)Bob将Alice的两半报文合在一起,并用他的私钥解密;Bob将他加了密的另一半报文传送给Alice。

    (7)Alice将Bob两半报文合在一起,并用她的私钥解密。

    这里重要的一点是:只有报文的一半,没有另一半,报文是毫无用处的。Bob只有到步骤(6)步才能读Alice的报文,Alice只有到步骤(7)步才能读Bob的报文。有很多办法实现它:

    (1)如果采用分组加密算法,每一分组的一半(例如,每隔一比特)能在每半个报文中发送。

    (2)报文的解密依赖于初始矢量(参看9.3节),初始矢量可以在报文的另一半中发送。

    (3)首先发送的一半报文可能是加密报文的单向hash函数(参看2.4节),并且加密报文本身可能是另一半。

    为了了解这样做是怎样对Mallory制造麻烦的,让我们再看看他破坏协议的企图。他仍然能够在第(1)步和第(2)步中用自己的公开密钥代替Alice和Bob公开密钥。但现在,当他在第(3)步截取Alice的一半报文时,他不能用他的私钥对报文解密,然后用Bob的公开密钥再加密,他不得不虚构一完全不同的新报文,并将它的一半发送给Bob。当他在第(4)步截取Bob给Alice的一半报文时,他有同样的问题,他不能用他的私钥解密,并用Alice的公开密钥再加密,他又不得不虚构一完全不同的新报文,并将它的一半发送给Alice。当他在第(5)步和第(6)步截取到实际报文的另一半时,他再去把他虚构新报文改回来,就太迟了。Alice和Bob之间的会话必会是完全不同的。

    Mallory也可以不用这种办法。如果他非常了解Alice和Bob,他就可以模仿他们之中的一个同另一人通话,他们绝不会想到正受到欺骗。但这样做肯定比坐在他们之间截取和读他们的报文更难。