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)消息認證和保密:與密文有關的認證