--- title: MAC tags: crypto lang: zh_tw --- * [筆記總覽](https://hackmd.io/@LJP/rkerFdnqS) [TOC] # MAC MAC(Message Authentication Codes) 大致上機制是這樣的: Alice 與 Bob 使用同一個金鑰 Alice 將欲傳送的訊息配上金鑰丟給一個演算法生出 Checksum1 並將訊息與 Checksum1 一起傳給 Bob Bob 再將拿到的訊息配上金鑰丟到同一個演算法生出 Checksum2 若 Checksum1 與 Checksum2 相同則表示訊息沒有被改過 最主要是用來提供驗證性 但因為是共用一個金鑰,雙方都能生出一樣的 Checksum **所以 MAC 無法提供不可否認性** 後面講講幾種產生 MAC 的方式 - HMAC - CBC-MAC - DAA - CMAC ## MAC vs MDC Message Detection Code 與 MAC 的不同是 MAC 的過程需要 key MDC 比較像是 Hash, 不需要 key 只使用訊息內容產生 Checksum ## HMAC ![](https://i.imgur.com/2T5jkck.png) 解釋一下內容 $k^+$ 是將 Key padding 成一個 block 的長度, 以 0 來 padding $ipad$ 為 Byte 0x36 一直重複成一個 block 的長度 $opad$ 為 Byte 0x5c 一直重複成一個 block 的長度 $x_1, ..., x_n$ 為訊息切成的 block 們, 不足一個 block 的部分不須 padding $h$ 為 Hash function, 這邊要用何種 Hash 都可以 (md5, SHA1, ...) 雙方應共享 Key (若有設定 IV, 則也要共享), 方能算出一樣的 $HMAC_k(x)$ HMAC 的 H 即代表 Hash Function 程式碼可以參考 [python hmac.py](https://github.com/python/cpython/blob/master/Lib/hmac.py) ## CBC-MAC 簡單來說就是用 Block cipher 將訊息切成 Blocks 使用 CBC mode 來加密 並以最後一塊的密文來當作 MAC ## DAA [Data Authentication Algorithm](https://en.wikipedia.org/wiki/Data_Authentication_Algorithm) 上面 CBC-MAC 沒有說要用哪種 Block cipher DAA 就等同是使用 DES, IV=0 的 CBC-MAC 最後取 $M$ bits MSB 當作 MAC, $16 \le M \le 64$ 這個 MAC 又有其自訂的術語, 叫做 DAC(Data Authentication Code) ## CMAC 也是基於 CBC-MAC ![](https://i.imgur.com/9dMt87T.png) 使用兩把 key key1 拿來做 Block Cipher 加密 最後一次 Block Cipher 前 xor key2 選擇 t bits MSB 當作 MAC