\chapter{Blockverschlüsselungsverfahren}
    Ein Verschlüsselungsverfahren wird als Blockverschlüsselungsverfahren bezeichnet, 
    wenn die Menge der Nachrichten $\mathscr M$ durch die Menge der Blöcker einer festen Länge $n\in \mathbb{N}$ gegeben ist:
    $$\mathscr M := ({\mathbb{Z}_2}^8)^n = \{(z_1,z_2,...,z_n)\mid z_i\in{\mathbb{Z}_2}^8\}$$
    \textbf{Wichtig}\\
    \begin{itemize}
        \item Häufig wird für Blöcke die aus $n$ Bytewerten die Blocklänge in Bits (Blocklänge$=n\cdot 8$) angegeben
        \item Die Menge der Blöcke $\mathscr M$ kann als Vektorraum über $\mathbb{Z}_2$ aufgefasst werden. 
            Hierbei wird die Summe von zwei Blöcken $m_1,m_2\in\mathscr M$ durch eine bitweise Addition definiert, welcher einer Bitweisen XOR-Verknüpfung ($\oplus$) entspricht.
        \item Da sich die Vektoren aus ${\mathbb{Z}_2}^{8\cdot n}$ in Zahlen aus $\mathbb{Z}_{2^{8\cdot n}}$ umrechnen lassen könnte man sie auch auf diese Art addieren.
            Hierbei erhält man allerdings ein deutlich anderes Ergebnis als bei XOR-Addition.
            Aus diesem Grund wird in diesem Fall das Symbol $\boxplus$ verwendet. 
    \end{itemize}

    \section{Padding-Verfahren}
        Damit Daten beliebiger Länge mit einem Blockverschlüsselungsverfahren verschlüsselt werden können muss die Nachricht auf ein Vielfaches der Blocklänge aufgestockt werden.
        Man spricht von Padding.
        Um dem Empfänger mitzuteilen, welche übertragenen Daten zum Padding und nicht zur Nachricht gehören gibt es mehrere Möglichkeiten:
        \begin{itemize}
            \item Die Anzahl der Padding-Bytes wird mit übertragen
            \item Als Paddingbytes werden Zeichen verwendet, die nicht in die Kodierung passen (z.B. 0x00 bei ASCII)
            \item Es findet immer Padding statt (bei passender Nachrichtenlänge ist der ganze letzte Block Padding), wobei im Padding die Paddinglänge kodiert ist.
        \end{itemize}
    
    \section{Betriebsmodi}
        Es gibt eine Vielzahl von Betriebsmodi, die für die Blockverschlüsselung verwendet werden.
        Auf diese wird im Folgenden eingegangen

        \subsection{ECB (Electronic Code Book)}
            Im ECB-Modus wir mit dem Verschlüsselungsverfahren $E$ jedes Tupel von Blöcken blockweise verschlüsselt:
            $$E_k((m_1,...,m_r)) := (E_k(m_1),...,E_k(m_r))$$
            eine auf diese Weise verschlüsselte Nachricht kann ebenfalls Blockweise entschlüsselt werden:
            $$D_k((c_1,...,c_r)) := (D_k(c_1),...,D_k(c_r))$$
            \includegraphics{ECB.png}\\
            Da diese Modus anfällig für Wörterbuchangriffe ist wird häufig ein Nonce-Wert verwendet, der jeweils mit dem Klartextblock addiert ($\oplus$) wird:\\
            \includegraphics{ECB_Nonce.png}

        \subsection{CBC (Cipher Block Chaining)}
            Der CBC-Modus ist eine spezielle Form des ECB-Modus, bei dem der errechnete Geheimtextblock als Nonce-Wert für die Verschlüsselung des nächsten Blocks verwendet wird.
            Hierbei wird der erste Nonce-Wert $c_0$ durch einen Initialisierungsvektor $IV\in\mathscr M$ gegeben.
            $$\begin{aligned}
                c_i:=&E_k(m_i+c_{i-1})\\
                E_{k,IV}(m_1,...,m_r) :=&(c_1,...,c_r)
            \end{aligned}$$
            \includegraphics{CBC_enc.png}\\
            Bei der Entschlüsselung wird wie folgt vorgegangen:
            $$\begin{aligned}
                m_i :=&D_k(c_i)+c_{i-1}\\
                D_{k,IV}(c_1,...,c_r):=&(m_1,...,m_r)
            \end{aligned}$$
            \includegraphics{CBC_dec.png}