---
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

解釋一下內容
$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

使用兩把 key
key1 拿來做 Block Cipher 加密
最後一次 Block Cipher 前 xor key2
選擇 t bits MSB 當作 MAC