\section{Part 1: Substitution Cipher}

\subsection{Analyse}

Als Programmiersprache wurde Go\footnote{\href{https://go.dev/}{https://go.dev/}} ausgewählt. Das Analysetool soll jeden Buchstaben eines Textes auf Häufigkeit untersuchen.

Im Prgram wird mit einem Array aus Buchstaben-Strukts gearbeitet. 

\begin{lstlisting}
    type letter struct {
        upperCase string
        lowerCase string
        count     int
        frequency float64
    }
    type letterList []letter
    
    func (l letterList) Len() int {
        return len(l)
    }
    
    func (l letterList) Less(i, j int) bool {
        return l[i].frequency > l[j].frequency
    }
    
    func (l letterList) Swap(i, j int) {
        l[i], l[j] = l[j], l[i]
    }
\end{lstlisting}

Darin wird der Buchstabe swowohl groß, als auch klein als String abgespeichert. Außerdem wird die dazugehörige Anzahl mit der Häufigkeit abgespeichert. Dadurch kann nach dem Durchlauf der Datensatz einfach sortiert werden.

Das Alphabet wird im “Unicode Code Point” genutzt damit es einfach verglichen werden kann. Zum Start des Programmes wird das Alphabet in dem ``letters''-Array initialisiert.

\begin{lstlisting}
    var letters = make([]letter, lettersInTheAlphabet)

    func initLetterStruct() {
        for i := 0; i < lettersInTheAlphabet; i++ {
            letters[i].upperCase = string(rune('A' + i))
            letters[i].lowerCase = string(rune('A' + i + 32))
        }
    }
\end{lstlisting}

Danach wird die angegebene Datei gelesen und als String geparsed. Der String wird anschließend mit der ``strings.Count''-Funktion gelesen und die gelesene Anzahl im Struct gespeichert.

\begin{lstlisting}
    func countLetters(inputText string) int {
        totalCount := 0
        for i := 0; i < lettersInTheAlphabet; i++ {
            letters[i].count +=
                strings.Count(inputText, letters[i].lowerCase) +
                    strings.Count(inputText, letters[i].upperCase)
            totalCount += letters[i].count
        }
        return totalCount
    }
\end{lstlisting}

Wenn alle Buchstaben gelesen wurden, kann die totale Anzahl an Buchstaben genommen werden um die Häufigkeit zu berechnen. Bevor die sortierte Ausgabe erfolgt werden die Daten mit gonum.org/v1/plot/plotter\footnote{\href{https://pkg.go.dev/gonum.org/v1/plot/plotter}{https://pkg.go.dev/gonum.org/v1/plot/plotter}} in einer ``barChart.png'' Datei gezeichnet (Abb. \ref{fig:Visualisierung von plaintext.txt}).

\begin{figure}[H]
    \begin{center}
        \includegraphics[width=0.9\textwidth]{part1/barChart01}
        \caption{Visualisierung von plaintext.txt}
        \label{fig:Visualisierung von plaintext.txt}
    \end{center}
\end{figure}

Zuletzt wird das soriterte Ergebnis ausgegeben (Abb. \ref{fig:Ergebnis von plaintext.txt}).

\begin{figure}[H]
    \begin{center}
        \includegraphics[width=0.8\textwidth]{part1/result01}
        \caption{Ergebnis von plaintext.txt}
        \label{fig:Ergebnis von plaintext.txt}
    \end{center}
\end{figure}

\newpage

\subsection{Verschlüsselung}

Zur verschlüsselung wird ebenfalls “Unicode Code Point” genutzt. Dadurch kann der jeweilige Text einfach um die angegeben Zahl verschoben werden. Dabei zu beachten ist das Ende des Alphabetes, da von vorne begonnen werden muss. Außerdem sind sollten Kleinbuchstaben und Großbuchstaben beachtet werden. Alle Zeichen die keine Buchstaben sind, werden ohne verschlüsselung ausgegeben. Nach dem Lompilieren kann die Verschlüsselung einfach mit Parametern gestartet werden:

\begin{verbatim}
    ./tool -k florianhoss -f input.txt
\end{verbatim}

\subsubsection{Originaler Text (input.txt)}

\VerbatimInput{images/part1/input.txt}

\cite[vgl.][]{bbc}

\newpage

\subsubsection{Verschlüsselter Text (output.txt)}

\VerbatimInput{images/part1/output.txt}

\newpage

Das erneute Ausführen der Analyse ergibt eine gleichmäßigere Verteilung der Buchstaben (Abb. \ref*{fig:Visualisierung von input.txt} und Abb. \ref*{fig:Visualisierung von output.txt}). Damit ist eine Häufigkeitsanalyse auf den ersten Blick nicht mehr möglich.

\begin{figure}[H]
    \begin{center}
        \includegraphics[width=0.9\textwidth]{part1/barChart02}
        \caption{Visualisierung von input.txt}
        \label{fig:Visualisierung von input.txt}
    \end{center}
\end{figure}

\begin{figure}[H]
    \begin{center}
        \includegraphics[width=0.9\textwidth]{part1/barChart03}
        \caption{Visualisierung von output.txt}
        \label{fig:Visualisierung von output.txt}
    \end{center}
\end{figure}

Eine Häufigkeitsanalyse kann Hilfreich sein, da in unterschiedlichen Sprachen andere Häufigkeiten auftreten können und damit der Text einfacher analysiert werden kann. Wenn bei einem Cipher eine Häufigkeitsanalyse erfolgreich durchgeführt werden kann, können Wörter oder Sätze erkannt und entschlüsselt werden.
