\documentclass[12pt,a4paper,german]{article}
\usepackage{url}
%\usepackage{graphics}
\usepackage{times}
\usepackage[T1]{fontenc}
\usepackage{pifont}
\usepackage{ngerman}
\usepackage{float}
\usepackage{diagbox}
\usepackage[latin1]{inputenc}
\usepackage{geometry}
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{delarray}
% \usepackage{minted}
\usepackage{csquotes}
\usepackage{graphicx}
\usepackage{epsfig}
\usepackage{longtable}
\usepackage{paralist}
\geometry{left=2.0cm,textwidth=17cm,top=3.5cm,textheight=23cm}

\graphicspath{.}

%%%%%%%%%% Fill out the the definitions %%%%%%%%%
\def \name {Valentin Brandl}					%
\def \matrikel {108018274494}				%
% \def \pname {Vorname2 Nachname2}				%
% \def \pmatrikel {Matrikelnummer2}				%
\def \gruppe {Gruppe 193}					%
\def \uebung {6}								%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 % DO NOT MODIFY THIS HEADER
\newcommand{\hwsol}{
\vspace*{-2cm}
\noindent \matrikel \quad \name \hfill Gruppe:\gruppe \\
% \noindent \pmatrikel \quad \pname \\
\begin{center}{\Large \bf L\"osung f\"ur \"Ubung \# \uebung}\end{center}
}

\newcommand{\cmark}{\ding{51}}%
\newcommand{\xmark}{\ding{55}}%
\newcommand{\csquare}{\text{\rlap{$\checkmark$}}\square}%

\begin{document}
%Import header
\hwsol


\section*{Aufgabe 1}

\begin{enumerate}[a)]

    \item Ein einzelner der im Paper beschriebenen FPGAs kann 400.000.000 (400 Millionen) Schlüssel pro Sekunde testen.

    \item Der Average Case einer Schlüsselsuche eines $n$-Bit Schlüssels beträgt $2^n / 2$ und der worst-case beträgt
        $2^n$, ist also um Faktor 2 langsamer. Der average-case für DES auf einem COPACOBANA beträgt 9 Tage, der
        worst-case sind also 18 Tage.

    \item Anzahl der Verdoppelungen nach Moore's Law: $((2019 - 2006) * 12) / 18 = 8,6667 \approx 9$

        Average Case zum Brechen von DES in 2006: 9 Tage

        Verbesserung nach $9$ Iterationen von Moore's Law: $9 / (2^9) = 0,0176$

        Im average case lässt sich eine DES-Schlüsselsuche 2019 in weniger als einem Tag durchführen (weniger als einer
        halben Stunde).

        Mit $8$ Iterationen gerechnet, kommt man auf $9 / (2^8) = 0,0351$ Tage, also knapp unter $1$ Stunde.

    \item Eine Implementierung als FPGA ist deutlich schneller, als eine Software Implementierung auf general purpose
        Hardware zu den selben Kosten. Eine Implementierung als ASIC lässt sich nur verwenden um einen bestimmten
        Algorithmus anzugreifen, während man FPGAs neu programmieren kann, um anderen Algorithmen anzugreifen.

    \item Ein einzelner FPGA konnte 2006 400 Millionen Schlüssel pro Sekunde testen. Unter Anwendung von 8 Iterationen
        von Moore's Law (siehe c)) ergibt sich daraus eine Leistung von $400000000 * 2^8 = 102.400.000.000$ Schlüssel
        pro Sekunde im Jahr 2019

        Ein COPACOBANA enthält 120 FPGAs, von denen jeder $102400000000$ Schlüssel pro Sekunde testen kann. Der gesamte
        COPACOBANA kann also $120 * 102400000000 = 12288000000000$ Schlüssel pro Sekunde testen.

        15000 COPACOBANA kommen also auf $15000 * 12.288.000.000.000 = 184.320.000.000.000.000$ Schlüssel pro Sekunde.

        Eine Blockchiffre mit einer Schlüssellänge von 128-bit hat $2^{128}$ Mögliche Schlüssel. Eine durchschnittliche
        Schlüsselsuche muss also $2^{128} / 2$ Schlüssel testen.

        Sei $p = 184.320.000.000.000.000 \frac{k}{s}$ (Schlüssel pro Sekunde) die Leistung des COPACOBANA Clusters und
        $r = (2^{128} / 2) k$ die Anzahl der zu testenden Schlüssel, ergibt sich die Dauer des Angriffs mit $\frac{r}{p}
        = \frac{(2^{128} / 2)}{184.320.000.000.000.000} s \approx 9.231 * 10^{20} \approx 2.564 * 10^{17} h \approx
        1.068 * 10^{16} d \approx 29271308980213 y$

    \item Benötigte Rechenleistung $p$ (in Schlüssel pro Sekunde) um eine 128-bit Blockchiffre mit einer durchschnittlichen
        Suchzeit von 24 Stunden zu brechen:

        $86400 = \frac{2^{128}/2}{p} \Rightarrow p = 1.969.226.660.422.097.589.487.121.570.785.695 \approx 1.969 *
        10^{30}$

        \begin{align*}
            12288000000000 * (2^x) &> 1.969 * 10^{30} \\
            \Rightarrow x &> 57153
        \end{align*}

        Nach $57153$ Iterationen von Moore's Law, also $57153 * 18m = 1028754m \approx 85730y$, lässt sich eine 128-bit
        Blockchiffre in weniger als 24 Stunden brechen. Das ist im Jahr $85730 + 2019 = 87749$

\end{enumerate}

\section*{Aufgabe 2}

\begin{enumerate}[a)]

    \item

        \begin{enumerate}[1.]
            \item Ausgabe der f-Box $f_{out} = R_1 \oplus L_0$

            \item Ausgabe der S-Boxen $s_{out} = P^{-1}(f_{out})$

            \item Mit $s_{out}$ lässt sich der Input der S-Boxen $s_{in}$ einschränken

            \item $k_1 = E(R_0) \oplus s_{in}$
        \end{enumerate}

    \item Jede S-Box hat $2^6 = 64$ Mögliche Eingangswerte und $2^4 = 16$ Mögliche Ausgangswerte

        $\Rightarrow 64/16 = 4 \Rightarrow$ ca $4^8 = 65536$ Kandidaten

    \item Berechnungen wurden mit dem im Anhang befindlichen Code durchgeführt. Die inverse der P-Box wurde per Hand
        erstellt.

        $s_{out_1}$ für $X_1,Y_1$: 0111 1101 1001 0101 1011 1100 1001 0000 $\Rightarrow$ 7 13 9 5 11 12 9 0

        Mögliche Werte für $s_{in_1}$: $\{011110,000101,110110,101111\}$ $\{011010,000011,101100,100001\}$
        $\{000100,000111,100110,101011\}$ $\{010110,000111,111000,110101\}$ $\{001100, 000011, 100110,100001\}$
        $\{000000,001011,101100,100111\}$ $\{010100, 001011,111100, 110001\}$ $\{011010,011001,110000,110111\}$

        $s_{out_2}$ für $X_2,Y_2$: 1000 0101 1101 0011 0010 0010 0110 1000 $\Rightarrow$ 8 5 13 3 2 2 6 8

        Mögliche Werte für $s_{in_2}$: $\{001110, 011111,100110,100101\}$ $\{011100,011111,110000,111011\}$ $\{010010,
        000001,100000,100101\}$ $\{000110, 001111,110100,100001\}$ $\{000000,000101,100010,101101\}$
        $\{001010,000111,101000,100101\}$ $\{011100,011111,110100,100001\}$ $\{010000, 000111,111110,101101\}$

        $e_{out_1} =$ 011101010011001011101000000000010000000000000000

        $e_{out_2} =$ 101010000001001001111000000000010000000000000000

        Weiterer Ansatz: Alle $4^8$ Permutationen von $s_{in_1}$ und $s_{in_2}$ erzeugen und die Ergebnisse $\oplus
        e_{out_1}$ bzw. $e_{out_2}$ rechnen. Die Schnittmenge aus dem ersten und zweiten Schritt bilden. Diese
        Schnittmenge enthält die Schlüsselkandidaten.

    \item PC-2 hat $2^{56}$ mögliche Inputs und $2^{48}$ mögliche Outputs.

        $2^{56} / 2^{48} = 1024$ Kandidaten

\end{enumerate}


% \section*{Code}

% \inputminted{rust}{./school/intro-crypto/uebung/06/des/src/main.rs}

\end{document}

