密碼學專題 - 消息認證碼 (MAC)
消息認證碼,或者 MAC,用于檢測對消息的篡改。加密使 Eve 不能夠獲取消息的內容,但不能防止 Eve 對消息進行操縱,這時就需要消息認證碼。與加密消息一樣,MAC 也使用一個密鑰 ,Alice 和 Bob 知道這個密鑰但 Eve 不知道。當 Alice 向 Bob 發(fā)送消息
時,不僅僅發(fā)送消息
,而且還發(fā)送一個由 MAC 函數(shù)計算得到的 MAC 值。Bob 檢驗接收到的消息的 MAC 值與收到的 MAC 值是否相等,如果不匹配則丟棄這個沒能通過認證的消息。由于 Eve 不知道密鑰
,所以不能為篡改后的消息找到正確的 MAC 值,從而保證 Eve 不能對消息進行操縱。
8.1 MAC 的作用
MAC 函數(shù)有兩個輸入,其中一個是固定長度的密鑰 ,另一個是任意長度的消息
,產生固定長度的 MAC 值。這里將 MAC 函數(shù)表示為
。為了對一個消息進行認證,Alice 把消息
與 MAC 值
一起發(fā)送,這個 MAC 值也稱為標簽 (tag)。假設 Bob (同樣有密鑰
) 收到消息
和標簽
后,可以使用 MAC 驗證算法來檢驗
是否成立。
8.2 CBC-MAC 和 CMAC
CBC-MAC 是一種將分組密碼轉換為 MAC 的經典方法,密鑰 被用作分組密碼的密鑰。CBC-MAC 所采用的方法是對消息
用 CBC 模式進行加密,而只保留密文的最后一個分組,其余全部丟棄。對一個由分組
組成的消息,MAC 計算過程為:
有時也會取最后一個分組的一部分 (例如一半) 作為 CBC-MAC 函數(shù)的輸出。CBC-MAC 的常見定義要求 IV 固定為 0。
8.3 HMAC
既然理想的 MAC 是一個以密鑰和消息為輸入的隨機映射,而且我們已經有了與隨機映射類似的散列函數(shù),因此很自然地會想到用散列函數(shù)構造 MAC,這正是 HMAC 所要完成的工作。HMAC 的設計者當然非常了解散列函數(shù)的問題,正是由于這個原因,不能將 HMAC 簡單地定義為 `、
甚至
等,因為如果使用標準的迭代散列函數(shù)會產生很多問題。
所以在 HMAC 中計算 ,其中 a 和 b 為指定的常數(shù)。即首先對消息進行一次散列運算,輸出結果再與密鑰一起進行散列運算。
附錄 1. MAC
與密鑰相關的單向散列函數(shù)通常稱為 MAC,即消息認證碼 (MAC, Message Authentication Code)。MAC 具有與先前討論的單向散列函數(shù)同樣的特性,但 MAC 還包括一個密鑰。只有擁有相同密鑰的人才能鑒別這個散列。這對于在有沒有保密的情況下提供可鑒別性是非常有用的。
MAC 可在用戶之間鑒別文件。它還可以被單個用戶用來確定他的文件是否已改動,或是否感染了病毒。用戶也可以計算出文件的 MAC,并將該值存入某個表中。如果用戶采用了單向散列函數(shù),在感染病毒后就可以計算出新的散列值,并用它代替表中的值。病毒就不能做到這一點,因為它不知道密鑰。
將單向散列函數(shù)變成 MAC 的一個簡單辦法是用對稱算法加密散列值。相反,將 MAC 變成單向散列函數(shù)則只需將密鑰公開即可。
項目源代碼
項目源代碼會逐步上傳到 Github,地址為 https://github.com/windstamp。
Contributor
- Windstamp, https://github.com/windstamp