\chapter{Das Diffie-Hellman-Schlüsselaustauschverfahren}
    In allen Fällen, in denen ein symmetrisches Schlüsselverfahren (inkl. MAC-Verfahren) verwendet wird ist es nötig den Schlüssel sicher auszutauschen.
    Eine Möglichkeit ist es diese Übertragung über einen sicheren Kanal (z.B. persönliche Übergabe) zu organisieren.
    Dies ist allerdings mit einem hohen Aufwand verbunden und erlaubt nicht einen sicheren Kanal in Echtzeit (z.B. für HTTPS) aufzubauen.
    Hierfür wurde von W.Diffie udn M.E.Hellman auf Basis der Arbeit von R.C.Merkle ein asymmetrisches Schlüsselaustauschverfahren entwickelt, welches als DH-Verfahren bekannt ist.
    Asymmetrische Verschlüsselungsverfahren zeichnen sich durch die Verwendung von \textbf{Schlüsselpaaren} ($k=(k_{\text{priv}},k_{\text{pub}})$) aus.
    Diese Schlüsselpaare sollten folgende Eigenschaften haben:
    \begin{itemize}
        \item Ein Schlüsselpaar ist genau einem Besitzer zugeordnet
        \item Niemals hat jemand anderes als der Besitzer zugriff auf den privaten Schlüssel $k_\text{priv}$
        \item Der private Schlüssel wird vom Besitzer selber generiert
        \item Der öffentliche Schlüssel $k_\text{pub}$ lässt sich effizient aus $k_\text{priv}$ errechnen
        \item Es gibt keinen effizienten Algorithmus um mithilfe von $k_\text{pub}$ $k_\text{priv}$ zu bestimmen
    \end{itemize}
    Vor dem Austausch eines symmetrischen Schlüssels besitzen beide Seiten jeweils ein unabhängiges asymmetrisches Schlüsselpaar.

    \section{Das DH-Verfahren in Einzelschritten}
        Im Folgenden werden Alice und Bob als Synonyme für zwei beliebige Sender/Empfänger genutzt:
        \begin{itemize}
            \item Alice und Bob vereinbaren zwei Parameter (meist durch einen Standard spezifiziert): 
                \begin{itemize}
                    \item eine große Zahl $n\in\mathbb{N}$
                    \item eine Zahl $g\in\mathbb{Z}_n^*$ deren Ordnung $o(g)$ mindestens durch eine sehr große Primzahl geteilt wird.
                \end{itemize}
            \item Alice bestimmt eine zufällig Zahl $e_A\in\mathbb{Z}_n^*$ als privaten Schlüssel:
                $$k_{A,\text{priv}}=e_A$$
                und errechnet den öffentlichen Schlüssel $k_{A,\text{pub}}=g^{e_A}\in\mathbb{Z}_n$
            \item Bob bestimmt ebenfalls eine Zufallszahl $e_B\in\mathbb{Z}_n^*$ und damit ein Schlüsselpaar:
                $$(k_{B,\text{priv}},k_{B,\text{pub}})=(e_B,g^{e_B})$$
            \item Alice und Bob tauschen ihre öffentlichen Schlüssel aus.
            \item Alice berechnet in $\mathbb{Z}n$:
                $$s_A:=(g^{e_B})^{e_A}$$
                Bob berechnet in $\mathbb{Z}n$:
                $$s_B:=(g^{e_A})^{e_B}$$
            \item Der gemeinsame Schlüssel (shared secret) ergibt sich durch:
                $$s_A:=(g^{e_B})^{e_A}=g^{e_B\cdot e_A}=g^{e_A\cdot e_B}=(g^{e_A})^{e_B}=s_B$$
        \end{itemize}

    \section{Das Diskrete-Logarithmus-Problem (DL-Problem)}
        Das Diskrete-Logarithmus-Problem bildet die mathematische Grundlage dafür, dass Schlüssel mittels der DH-Verfahrens über einen potentiell unsicheren Kanal übertragen werden können.
        Das Problem definiert sich wie folgt:
        \begin{mybox}
            \textbf{DL-Problem}\\
            Gegeben seien $n\in\mathbb{N},g\in\mathbb{Z}_n^*$ und eine Potenz von $g$ in $\mathbb{Z}_n$:
            $$a\in\langle g\rangle:=\{g^e\mid e\in\mathbb{N}\}$$
            Als DL-Problem wird die Aufgabe bezeichnet nur mittels $a$ und $g$ einen passenden Exponenten $e$ für $a=g^{e}$ zu finden.\\
            Es wird vermutet, dass es keinen effizienten Algorithmus gibt.
        \end{mybox}

        \subsection{Das Diffie-Hellman-Problem (DH-Problem)}
            Das DH-Problem ist eine Variante des DL-Problems, bei der zwei Potenzen $g^{e_A},g^{e_B}\in\langle g\rangle$ gegeben sind.
            Hierbei wird die Zahl $g^{e_A\cdot e_B}$ gesucht.
            Auch hier wird vermutet, dass es keinen effizienten Algorithmus gibt.

    \section{Beispielanwendung des DH-Verfahrens}
        \includegraphics[scale=0.75]{DH-Verfahren.png}

    \section{Angriffe auf das DH-Verfahren}
        \subsection{Pohlig-Hellman-Reduktion}
            Eine Brute-Force-Suche für das DL-Problem wird dadurch vereinfacht, dass sich die Brute-Force-Suche auf eine Brute-Force-Suche auf die Untergruppen von $\langle g \rangle$ mit maximaler Primzahlpotenz reduzieren lässt.
            Ein optimaler Schutz bietet die Wahl einer Primzahl $n$ bei der $n-1$ die Primfaktorzerlegung $n-1=2\cdot q$ hat ($q$ ist eine Primzahl).

        \subsection{Shanks' \glqq Baby Steps Giant Steps\grqq-Verfahren (BSGS-Verfahren)}
            Falls die Möglichkeit besteht $\tilde{m}:=\lceil \sqrt{m}\rceil$ viele Zahlen von $\mathbb{Z}n$ in einer Tabelle zu speichern,
            lässt sich ein gesuchter Exponent $x$ mit dem BSGS-Verfahren bereits mit der Berechnung von höchsten $2\tilde{m}$ vielen Potenzen finden.
            Das Verfahren ähnelt dabei dem Meet-in-the-middle-Angriff (siehe \ref{meet-in-the-middle}).

        \subsection{Pollard's Rho-Methode}
            siehe Skript 3 Kapitel 2.2.3 auf Seite 26(42)

        \subsection{Zahlkörpersieb}
        Zu Beginn der 1990er Jahre wurde das Zahlkörpersieb (Number Field Sieve (NFS)) als Methode zur Faktorisierung großer Zahlen $n$ und zur Bestimmung diskreter Logarithmen in $\mathbb{Z}_n^*$ entwickelt. 
        Die Laufzeit zur Bestimmung diskreter Logarithmen in $\mathbb{Z}_n^*$ mithilfe des Zahlkörpersiebs kann durch
        $$O\left(e^{\left(\left(\frac{64}{9}\right)^{1/3}+o(1)\right)(\ln(n))^{1/3}(\ln(\ln(n)))^{2/3}}\right)$$
        von oben abgeschätzt werden.
