3.3 消息认证函数
消息认证机制在功能上分为上下两层:下层含有可以产生认证符的消息认证函数,而认证符是一个用来认证消息的值;上层是协议,作用是将该消息认证函数作为原语使接收方可以验证消息的真实性。
用来产生认证符的消息认证函数可分为以下3类。
1)消息加密函数。它是用整个消息加密后的密文作为对消息的认证。
2)消息认证码(MAC)。它是一个对信源消息进行编码并用生成的定长值作为认证符的函数。
3)Hash函数。它是公开的,可以将任意长的消息映射成具有固定长度的信息,并以该信息作为认证符。
接下来将介绍消息加密函数和消息认证码。
3.3.1 消息加密函数
消息加密本身提供了一种认证手段,即在认证中主要采用消息加密函数。按照采用的加密算法的不同,它一般分为两类:对称密钥加密函数和公开密钥加密函数。
图3-6展示了采用消息加密函数的认证过程,A为发送方,B为接收方。B接收到消息后,通过解密来判断消息是否来自A、消息是否完整以及有无篡改。
图3-6a中使用了对称密码算法。当只有A和B知道密钥K时,因为没有其他人能够解密出报文的明文,该过程即提供了保密性。
图3-6b中使用了公钥密码算法,提供了保密性,但不能提供认证,因为任何第三方都可以使用B的公钥PUb来加密报文,并谎称报文是来自A的。
为了能够提供认证,可以让A使用它自己的私钥PRa对报文进行加密,并让B用A的公钥PUa进行解密。图3-6c所示,该过程提供了认证,而且与常规加密的过程是相同的。同时,这种方式需要明文中具有某种内部结构,接收者才能区分正常的明文和随机的比特串。另外,这种结构也提供了数字签名,因为只有A拥有私钥PRa才可以生成密文。
图3-6 采用消息加密函数的认证方式
a)对称加密:保密性和认证 b)公钥加密:保密性 c)公钥加密:认证和签名 d)公钥加密:保密性、认证和签名
虽然图3-6c中的方案提供了认证和签名,但没有提供保密性。如果需要再提供保密性,如图3-6d所示,那么A可以先用自己的私钥PRa对报文进行加密,即可提供数字签名,然后再用B的公钥PUb来加密,以此来提供保密性。
3.3.2 消息认证码MAC
消息认证码(Message Authentication Code,MAC)是一种实现消息认证的方法,利用密钥来生成一个固定长度的小段信息并附加在消息之后,可以用来防止攻击者恶意篡改或伪造消息。在这种方法中,若发送方A准备向接收方B发送消息,则A就计算MAC,它是消息和密钥的函数,即
MAC=C(K,M)
上式中,M是输入消息,C是MAC函数,K是仅由收发双方共享的密钥,MAC为消息认证码。
消息和MAC一起被发送给接收方。接收方对收到的消息用相同的密钥K进行计算,就得到MAC′,并将接收到的MAC与其计算出的MAC′进行比较。假定只有收发双方知道该密钥,那么若接收到的MAC与计算出的MAC′相等,则
1)接收方可以确信消息没有被改变。
2)接收方可以确信消息来自真正的发送方。
3)如果消息中包含序列号(如TCP的序列号),则接收方可以确信消息顺序是正确的。
MAC函数类似于加密函数,但不需要可逆性。因此,在数学上MAC函数比加密算法被攻击的弱点要少。
图3-7a所示,该方案只提供了对消息的认证,发送方A先对消息M进行加密,然后根据密文计算认证码,并将认证码与消息密文进行连接后发送给接收方B。B根据接收到的消息密文计算认证码并进行比较,如果相同,则可以确认消息来自于发送方A,然后对消息进行解密;否则,说明消息并不是来自于发送方A,就无须对消息进行解密。
图3-7a描述的过程只提供了认证,并没有提供保密。保密性可以通过对使用MAC函数之后的报文进行加密来提供,如图3-7b所示。发送方A在K1的作用下先生成了对M的认证码C(K1 ,M),然后将明文M与它的认证码C(K1 ,M)连接,再用K2进行加密。接收方B接收到消息后,先用K2对消息进行解密,然后计算M的认证码,再与接收到的认证码进行比较,如果两个认证码相等则说明消息M确实来自于发送方A。
图3-7c也同时实现了消息认证和保密,与图3-7b不同的是认证码与密文进行了连接。具体过程是,发送方A先对消息M进行加密,然后根据密文计算认证码,并将认证码与消息密文进行连接后发送给接收方B。B根据接到消息的密文计算出认证码,并与从A发来的报文中提取的认证码进行比较,如果二者相同,则说明消息确实来自于发送方A,然后再对消息进行解密;否则,说明消息并不是来自于发送方A,就无须对消息进行解密。
需要注意的是,MAC不等于数字签名,因为通信双方共享同一个密钥。此外,MAC拥有固定的长度。
图3-7 MAC的基本用法
a)消息认证 b)消息认证和保密:与明文有关的规定 c)消息认证和保密:与密文有关的认证