? ? ? ? 消息認證的目的是驗證消息的完整性和確認消息的來源。數字簽名的目的是不僅驗證消息的完整性和來源,還提供了不可否認性。此外,數字簽名還可以驗證消息的創建時間,防止重放攻擊。那么具體有哪些實現的方式呢?
一、僅提供消息認證
(1)方式一:通過對稱密鑰實現
????????Alice和Bob進行通信,在通信之前雙方共享了對稱密鑰K
????????首先Alice把消息明文進行哈希運算得到哈希值H,將哈希值用對稱密鑰進行加密的到哈希值的密文E,再將哈希值的密文與消息的明文進行拼接,通過公開信道發送給Bob。
????????然后,Bob拿到數據后將加密的哈希值通過對稱密鑰K進行解密,得到解密后的哈希值D,同時Bob還得把消息M自己做一次哈希運算也得到一個哈希值H。對比這兩個哈希值是否相等,就可以判斷出消息是否有可信的實體發來,并且判斷出消息是否完整。

(2)方式二:通過MAC實現
????????Alice和Bob進行通信,在通信之前雙方共享了一個隨機數S(這個隨機數可以理解為只有Alice和Bob才知道的一個秘密,也可以理解為一個密鑰,但這個密鑰不是用來加解密的)
????????首先Alice將明文與隨機數S拼接起來,對拼接后的信息進行哈希運算得到,然后將MAC與消息的明文M一起發給Bob
? ? ? ? Bob收到后,他也將消息的明文與隨機數S拼在一起做哈希運算,得到一個MAC。然后拿他算出的MAC與他從Alice處得到MAC做比較。如果相等就可以認為消息內容是完整的沒有被篡改,消息的來源是可信的。

?二、既提供加密又提供消息認證
(1)方式一:通過MDC與對稱加密實現
????????Alice和Bob進行通信,在通信之前雙方共享了對稱密鑰K
? ? ? ? Alice對消息明文進行哈希運算,得到哈希值H(也就是MDC),在將哈希值與明文拼在一起用對稱加密的密鑰K進行加密,得到密文。然后Alice將密文通過公開信道傳給Bob
? ? ? ? Bob得到了密文后,先拿對稱密鑰K進行解密,得到拼起來的兩部分:一部分是消息明文M,第二部分是個哈希值H(也就是MDC)。此時,Bob他自己對消息明文M進行哈希運算得到哈希值H,然后拿他算出來的哈希值H與解密出來的哈希值H進行對比。
? ? ? ? 在這種方式中,公開信道里傳遞的是密文,保證了消息的機密性。兩個哈希值對比相同的話,保證了消息的完整性。而消息來源的真實性是通過對稱密鑰K只有可信用戶才擁有來實現的。

(2)方式二:通過MAC與對稱加密實現
????????Alice和Bob進行通信,在通信之前雙方共享了對稱密鑰K和隨機數S
? ? ? ? 首先Alice將消息明文M與隨機數S拼接后進行哈希運算的到MAC,再將MAC與消息明文M拼接后拿對稱密鑰K進行加密得到密文。于是Alice就可以把密文通過公開信道發給Bob
? ? ? ? Bob收到密文后,通過手里的對稱密鑰K進行解密,解密出來的東西是兩部分:第一部分是消息明文M,第二部分是MAC。此時,Bob需要把消息明文M與隨機數S拼接再進行哈希運算得到MAC,拿著Bob自己算出來的MAC與解密得到的MAC進行對比。
? ? ? ? 在這種方式中,公開信道里傳遞的是密文,保證了消息的機密性。MAC對比相同的話,保證了消息的完整性和消息來源的真實性。此時消息來源的真實性是通過MAC實現的。因為MAC只有擁有S的人才能正確生成。而擁有S的人可以認為是可信任的人。

【注】本文中上圖的方式是先MAC再加密,也可以先加密再MAC。效果是一樣的就不贅述,用一個圖來展示一下即可。?

三、既提供了消息認證,又提供了數字簽名
(1)方式:通過MDC與公鑰密碼體制實現
????????Alice和Bob進行通信,事先他們各自生成公私密鑰對,并將各自的公鑰公布出來。
????????Alice對消息明文M進行哈希運算,得到哈希值H(也就是MDC),再用自己的私鑰對哈希值進行簽名生成一個密文S,再將S與明文M拼在一起通過公開信道傳給Bob
? ? ? ? Bob收到了消息明文M后,自己計算。于此同時他還需要在公鑰數據庫中找到Alice的公鑰對簽名進行解密,一旦成功解密則可以得到一個MDC,拿解密出來的MDC與他自己算出來的MDC進行比對即可驗證消息的完整性。
? ? ? ? 這種方式中,消息的完整性是通過MDC實現的,消息來源的真實性是通過公鑰密碼體制的數字簽名實現的。因為是Alice拿自己的私鑰簽名,所以實現了消息的不可否認性。

四、既提供了消息認證,又提供了數字簽名,還提供了保密性
(1)方式:通過MDC與混合密碼體制實現
????????Alice和Bob進行通信,事先他們各自生成公私密鑰對,并將各自的公鑰公布出來。并且他們實現共享了對稱密鑰K
? ? ? ? Alice首先把明文M進行哈希運算得到MDC,然后利用自己的私鑰對MDC進行加密。再將消息明文M與加密后的MDC拼接起來,再用對稱密鑰K進行加密,得到最終要發送的密文E,并把E通過公開信道發給Bob
? ? ? ? Bob得到密文后,用對稱密鑰K進行解密,他此時會得到兩個部分:第一個部分是消息明文M,第二個部分是一個密文。然后,Bob去公鑰數據庫中找到Alice的公鑰對這個密文進行解密,一旦成功解密就意味著這個消息是Alice發來的,否則就不是。
????????此時,通過Alice公鑰解密出來的東西是一個MDC,那么接下來,Bob需要自己將消息明文M進行哈希運算得到一個MDC與解密出來的MDC進行比對。如果比對成功,說明消息未被篡改,確保了消息的完整性。
? ? ? ? 在這個方式中,消息的完整性通過MDC來確保,消息的不可否認性通過公鑰密碼體制的數字簽名來確保,消息的機密性通過對稱密碼體制來確保。消息的來源真實性通過數字簽名確保。
