\chapter{MAC-Verfahren}
    Der \textit{Message Authentication Code} (MAC) stellt einen \say{digitalen Fingerabdruck} einer Nachricht dar.
    Dieser hängt von der Nachricht $m$ und einem Schlüssel $k$ ab.
    Die Abbildung $M:\mathscr K \times \mathscr M \rightarrow {\mathbb{Z}_2}^l$ mit einem konstanten $l\in\mathbb{N}$ wird als MAC-Verfahren bezeichnet, 
    falls ohne einen Schlüssel $k\in\mathscr K$ die Berechnung des MAC-Wertes $t=M_k(m):=M(k,m)$ für kein $m\in\mathscr M$ möglich ist.
    Dies soll auch dann nicht möglich sein, falls andere ($m_i$,$t_i$)-Paare bekannt sind.

    \section{HMAC}
        Jede Hashfunktion (siehe \ref{Hashfunktionen}) $H$ lässt sich in ein MAC-Verfahren $M=\text{HMAC-}H$ umwandeln durch:
        $$M_k(m):=H\left( (k\oplus\text{opad}) || H((k\oplus ipad)||m) \right)$$
        opad und ipad sind fest definierte Bytearrays der Bytelänge $r/8$.

    \section{CMAC, CBC-MAC}
        Im Folgenden wird auf zwei MAC-Konstruktionen eingegangen, die auf der Basis von Blockverschlüsselungsverfahren (siehe \ref{Blockverschlüsselungsverfahren}) definiert sind:

        \subsection{CMAC}
            Die Berechnung des MAC-Wertes $M_k(m)=M(k,m)$ mithilfe eines Blockverschlüsselungsverfahrens $E:\mathscr K \times ({\mathbb{Z}_2}^8)^n \rightarrow({\mathbb{Z}_2}^8)^n$ erfolgt,
            indem die durch ein Bytearray gegebene Nachricht $m$ wie folgt verändert wird:
            \begin{enumerate}
                \item $m$ wird durch ein Padding von der Form \say{80 00 ... 00} auf ein Vielfaches der Blocklänge $n$ gebracht:
                    $$\tilde{m}:=\begin{cases}
                        m & \text{falls }l(m)\mod n=0 \text{ und } l(m)\ne 0\\
                        m||\underbrace{80 00 ... 00}_{n-(l(m)\mod n)} & \text{falls }l(m)\mod n\ne 0  \text{ oder } l(m)=0
                    \end{cases}$$
                \item $\tilde{m}$ wird in Blöcke der Länge $n$ zerlegt
                \item der letzte Block $\tilde{m}_r$ wird wie folgt XOR-Verschlüsselt:
                    $$m_r:=\begin{cases}
                        \tilde{m}_r\oplus k_1 &\text{falls }l(m)\mod n = 0 \text{ und }l(m)\ne 0\\
                        \tilde{m}_r\oplus k_2 &\text{falls }l(m)\mod n \ne 0 \text{ oder }l(m)= 0
                    \end{cases}$$
                    $k_1$ und $k_2$ sind Modifikationen von $k_0 := E_k(0)$
                \item Die Blöcke inkl. des Verschlüsselten Blocks $m_r$ werden mit $IV=0$ CBC-Verschlüsselt (siehe \ref{CBC}) 
                \item Das Ergebnis wird als MAC-Wert ausgegeben
            \end{enumerate}

        \subsection{CBC-MAC}
            Falls die Nachrichtenmenge nur Nachrichten mit einer festen Bytelänge, die ein Vielfaches der Blocklänge ist, enthält,
            kann das CBC-Verfahren (siehe \ref{CBC}) direkt als MAC-Verfahren verwendet werden.
