在对称密码体制下,两个用户要进行保密通信,首先必须有一个共享的会话密钥。同时,为了避免攻击者获得密钥,还必须时常更新会话密钥,这都需要用到密钥分配的理论和技术。对称密码体制密钥分配的基本方法主要有以下几种。
1)由通信双方中的一方选取并用手工或网络方式发送给另一方。例如图7-1a所示,A选取密钥Ks发送给B。
2)如果双方之间已经存在一个共享密钥,则其中一方选取新密钥后可用已共享的密钥加密新密钥,然后通过网络发送给另一方。例如图7-1b所示,A、B双方之间已经存在一个共享密钥Ku,A选取密钥Ks并使用密钥Ku和加密算法E对Ks加密,即将EKu(Ks)发送给B。
3)由双方信任的第三方选取并用手工或网络方式发送给通信的双方。例如图7-1c所示,密钥分配中心(Key Distribution Center,KDC)选取密钥Ka发送给A,选取密钥Kb发送给B。
4)如果双方与信任的第三方之间分别有一共享密钥,那么可由信任的第三方选取一个密钥并通过各自的共享密钥加密发送给双方。例如图7-1d所示,A、B双方与KDC之间分别有共享密钥Ka、Kb,KDC选取密钥Ks并将加密后的EKa(Ks)发送给A,将EKb(Ks)发送给B。
图7-1 密钥分配的四种基本方法
在图7-1a和图7-1c中,这两种分配方法可用手工操作,虽然在网络通信的大多数场景下手工操作是不实际的,但在个别情况下还是可行的,比如对用户主密钥的配置,使用手工方式更可靠。图7-1b和图7-1d这两种方法是在网络环境下经常使用的密钥分配方法,由于可以通过网络自动或者半自动地实现,因此能够满足网络用户数量巨大的需求。特别是图7-1d中的方法,由于存在一个双方都信任的第三方KDC,因此只要双方分别与KDC建立共享密钥,就无须再两两建立共享密钥,从而可大大减少必需的共享密钥数量,降低密钥分配的代价。
下面再列举两个密钥分配的例子,一个是KDC密钥分配的例子;另一个是分布式密钥分配的例子。这两个密钥分配实例在实际应用中是相当广泛的。
1.KDC密钥分配
图7-2是借助密钥分配中心进行密钥分配的一个实例。在该实例中,假定用户A和B分别与KDC建立一个共享的主密钥Ka和Kb,当两个用户需要进行保密通信时,可以请求KDC利用各自的主密钥为他们分配一个共享的一次性会话密钥。一次通信完成后,会话密钥立即作废,而主密钥的数量与用户数量相同,可以通过更安全的方式甚至手工方式配置。具体的密钥分配步骤如下:
图7-2 KDC密钥分配实例
1)A向KDC发送一个建立会话密钥的请求消息Request||N1。
此消息由两个数据项组成,第1项是请求消息Request,第2项是这次呼叫的唯一标识符N1。N1可以是时间戳、计数器的值或随机数,每次请求所用N1的值应不同且难以猜测,以抵抗假冒和重放攻击。
2)KDC向A回复一个应答消息EKa[Ks||Request||N1||EKb(Ks,IDa)]。
应答消息是由A的主密钥Ka加密而成的。在这个消息中,KDC为A与B即将进行的通信生成一个会话密钥Ks,同时还用B的主密钥Kb产生一个加密包EKb[Ks,IDa]。因此,只有A和B可以通过解密此消息中的相应部分获得密钥Ks。另外,此消息还包含了第一步中的消息唯一标识符N1,它可以使A将收到的消息与发出的消息进行比较,如果匹配,则可以断定此消息不是重放的。(www.xing528.com)
3)A向B转发消息EKb(Ks,IDa)||EKs(N2)。
A收到应答消息后,解密出密钥Ks,再选取一个一次性随机数N2作为本次呼叫的唯一标识符,并使用Ks加密随机数N2,向B转发收到的EKb(Ks,IDa)和EKs(N2)。因为转发的是加密后的密文,所以转发过程是安全的。
4)B解密出Ks和N2并向A发送消息EKs[f(N2)]。
B从第3)步收到的消息中解密出Ks和IDa,由IDa可以识别消息来源的真实性,再用Ks解密出N2。B向A发送消息EKs[f(N2)],其中f是对N2进行的某种变换(比如加1)。A如果能用Ks解密出N2,则可断定B已经知道本次通信的会话密钥Ks,并且B在第3)步收到的消息不是一个重放的消息。其实第3)步就已完成密钥分配,第4)步执行的是认证功能。密钥分配过程结束后,接下来A和B就可以在Ks的保护下进行保密通信了。
在这个KDC密钥分配的例子中,通信双方在KDC的帮助下安全地共享了一个会话密钥Ks,但KDC并不知道双方在通信中使用会话密钥Ks的确切值。由于在需要保密的环节均使用相应的密钥进行保护,因此避免了机密信息的泄露和假冒,同时消息唯一性标识符的使用可以防止过期消息的重放。
2.分布式密钥分配
在KDC密钥分配中,KDC必须是中立可信的,每一个用户都绝对信任KDC的工作;同时KDC必须受到严密的保护,一旦KDC遭到入侵,可能造成用户主密钥的泄露,其后果是不堪设想的;另外,KDC可能会成为系统的瓶颈。如果两个用户之间已存在共享的主密钥,那么不需要KDC的参与也能实现会话密钥的共享,并避免了KDC密钥分配方案中存在的问题。图7-3是一个分布式密钥分配方案的实例,它没有KDC对密钥进行分配,假设用户A与用户B共享的主密钥为Mk,他们之间相互协商,通过三个步骤来建立会话密钥。
1)A向B发送一个建立会话密钥的请求消息Request||N1。
用户A向用户B发出建立会话密钥的请求,请求消息中带上一个一次性随机数N1,作为本次呼叫的唯一标识。
图7-3 分布式密钥分配实例
2)B向A回复一个应答消息EMk[Ks||Request||IDb||N1||N2]。
用户B选择一个会话密钥Ks构造应答消息,并用与A共享的主密钥Mk加密这个应答消息回送给A。应答消息中包括B选取的会话密钥Ks、B的身份标识IDb、B收到的随机数N1以及B选取的另一个新的一次性随机数N2,N2作为本次呼叫的唯一标识。
3)A解密出Ks和N2并向B发送消息EKs[f(N2)]。
A使用与B共享的主密钥Mk解密收到的消息,并进行真实性验证,使A确认收到的消息不是假冒或重放的。A向B发送消息EKs[f(N2)],其中f是对N2进行的某种变换(比如加1)。如果B能用会话密钥Ks解密收到的消息,且能正确地恢复出N2,则说明A已经掌握会话密钥Ks,密钥分配工作完成。
这个分布式密钥分配方案要求两个用户必须事先共享一个主密钥,才能完成会话密钥的分配。对于用户不多的小型网络,与一个用户有联系的用户数量不多,在每一用户同与其有联系的其他用户之间建立共享主密钥,可采用分布式密钥分配方案完成网络局部通信。对于用户众多的大型网络,在任何两个用户之间建立共享主密钥,主密钥数目过大,使用该方案分配密钥就不太现实了。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。