\section{Friend Finder}

Die Software die als praktischer Teil dieser Abschlussarbeit entwickelt wurde hat den Namen \textit{Friend Finder}. Im folgenden
werden zuerst 
die verschiedenen Features des Programms vorgestellt. Im Anschluss werde die verwendeten Verfahren und Bibliotheken, welche zur
Realisierung des Projektes verwendet wurden, erläutert. Im Abschnitt Implementierung wird kurz auf den Aufbau des Programmes
eingegangen. Zuletzt wird unter Analyse der gemessene Datenverkehr des \textit{Friend Finders} besprochen.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{Features}

\textit{Friend Finder} hat bietet verschiedene Features, welche vom Nutzer angewendet werden können und komplett in \textit{C}
implementiert wurden. Bei diesen Features handelt es sich um:

\begin{itemize}
 	\item Versenden von Nachrichten
 	\item Versenden der eigenen Position
	\item Anzeigen der Position von anderen Teilnehmern
	\item Erstellen eines 2D-Barcodes
 \end{itemize}

\subsubsection{Nachrichten versenden}

Der Nutzer kann hiermit Nachrichten verfassen und an einen, vorher festgellegten, Freund senden. Dieser kann wiederrum auf 
diese Nachrichten antworten. Die versendeten Textnachrichten werden vom Programm, mit einem vorher festgelegten \textit{private
key} verschlüsselt. Damit nun die andere Person die erhaltene Nachricht entschlüsseln kann, muss er den selben \textit{private
key} besitzen. 

\subsubsection{Eigene Position senden}

Mit \textit{Friend Finder} kann man die eigene Position im \textit{Latitude}/\textit{Longtitude} Format versenden. Auch hier 
werden die gesendeten Daten mit symmetrischen Verschlüsselungsverfahren für dritte unleserlich gemacht. 

\subsubsection{Position anderer Teilnehmer anzeigen}

Zusätzlich zum senden der eigenen Position, kann man sich auch die Positionen der anderen Teilnehmer anzeigen lassen. Hierbei
kann man wählen, ob man alle Nutzer innerhalb eines Radius von 100, 250 oder 1000 Metern sehen möchte. Dieser Radius geht von der
momentanen Position des Nutzers aus.

\subsubsection{2D-Barcode}

Da das Programm ein symmetrisches Verfahren anwendet, stellt sich die Frage wie man den \textit{private key} an andere Personen
 weitergeben kann, ohne dass dritte diesen auch erhalten können. Hier wäre ein Ansatz, dass man aus einer Zeichenketten einen
\textit{2D-Barcode} erstellt und ihn von anderen Nutzern abfotographieren lässt. Diese können aus dem erhaltenen Barcode nun
wieder die ursprüngliche Zeichenkette erstellen und haben somit den \textit{private key} erhalten. \newline

Dieser Programmteil kann anhanden einer solchen beliebigen Zeichenkette einen Barcode erstellen und ausgeben. Dieser könnte dann,
 wie schon erwähnt, mit einer entsprechenden anderen Software fotographiert und wieder umgewandelt werden.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{Verwendete Verfahren und Bibliotheken}

Um die Software, welche im Rahmen dieser Bachelor-Arbeit realisiert wurde, zu implementieren war die Nutzung verschiedener
Bibliotheken nötig. Im folgenden werden die verwendeten Bibliotheken kurz erläutert.

\subsubsection{Versenden der Nachrichten}

Um Nachrichten zu versenden wurde für dieses Projekt die \textit{IRC-Client Bibliothek}\citep{libircclient} verwendet. Diese
\textit{library} bietet verschiedene Funktionen um eine Verbindung mit einem \textit{IRC-Server} zu erstellen und Nachrichten an
diesen zu senden, sowie eingehende Nachrichten zu empfangen. Des weiteren ist es mit Hilfe dieser Bibliothek auch möglich,
Nachrichten zu versenden. \newline

\subsubsection{Verschlüsselung der Daten}

Zur Verschlüsselung der gesendeten Nachrichten wird die Bibliothek des \textit{OpenSSL-Projekts}\citep{OpenSSL} verwendet. Hierzu
werden die Daten mit dem \textit{Blowfish-Algorithmus} verschlüsselt. Bei diesem Algorithmus handelt es sich um ein symmetrisches
Verfahren, bei welchem alle Teilnehmer den gleichen privaten Schlüssel zum ver- sowie entschlüsseln nutzen. Die genutzte
Implementierung enstammt der \textit{libcrypto} Bibliothek.

\subsubsection{Erzeugen eines 2D-Barcodes}

\subsubsection{Grafisches Benutzeroberfläche}

Die Graphische Nutzeroberfläche wurde mit Hilfe von Bibliotheken aus dem \textit{Elementary}-Paket realisiert. Insbesondere sind
wurden \textit{Elementary} und \textit{Evas} genutzt. \textit{Elementary} ist eine Sammlung von \textit{Widgets} für
Benutzeroberflächen, welche einfach und schnell zu implementieren sind. Um das Zeichnen der Elemente auf verschiedenen Systemen
kümmert sich \textit{Evas}.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%

\subsection{Implementierung}

Das Programm \textit{Friend Finder} ist so konzipiert, dass die Graphische Darstellung ohne großen Aufwand vom den restlichen Teilen
der Software abgekoppelt werden kann und durch eine andere Bibliothek ersetzt werden kann. Dies hat zum Vorteil, dass man
\textit{Enlightenment} durch eine andere Art der Darstellung austauschen kann, ohne dabei die Funktionalität der zugrunde liegenden
Komponenten zu zerstören. Somit ist, was die Art der Darstellung angeht, schon von vornherein einfacher möglich die Software auf
unterschiedlichen Plattformen zu konvertieren. \newline
\textit{Friend Finder} ist an sich in fünf Submodule aufgeteilt. Diese wären

\begin{enumerate}
  \item Graphische Benutzeroberfläche
  \item Versenden von Textnachrichten
  \item Versenden der eigenen Position
  \item Empfangen der eigenen Position
  \item Erstellen eines Barcodes
\end{enumerate}

\subsubsection*{Graphische Benutzeroberfläche}

Zum erstellen der Oberfläche wurde, wie schon erwähnt, \textit{Enlightenment} verwendet. Durch diese Bibliothek werden alle benötigten
Funktionen bereitgestellt. Der gesammte Programmcode der Nutzeroberfläche wurde in eine Datei geschrieben (\textit{gui.c}). Diese
Tatsache macht die erhaltung der Modularität einfacher, da man einfach nur diese Datei durch eine andere ersetzen muss um eine anderen
Typ von Oberfläche zu nutzen. \newline
Inner der Datei \textit{gui.c} sind alle Funktionen enthalten um die Oberflächenelement zu erzeugen und zu platzieren. Um die gewünschte
Funktionalität der einzelnen Elemente zu realisieren wurden auch die Aufrufe der benötigten Funktionen aus anderen Modulen in dieser
Datei implementiert.

\subsubsection*{Versenden von Textnachrichten}

In der Datei \textit{msg\_sender.c} sind alle Funktionen und Aufrufe implementiert, welche nötig sind um die Verbindung zum 
\textit{IRC-Server} zu erstellen und die Nachrichten zu verschicken. Um eine Verbindung zu einem gegebenen \textit{IRC-Server} zu
erstellen muss eine \textit{IRC-Session} initialisiert werden. Diese \textit{Session} beinhaltet Informationen wie zum Beispiel
den \textit{Nickname} des Benutzers oder die \textit{IP-Adresse} des Servers. Nachdem diese \textit{Session} gestartet wurde,
kann man nun durch das Aufrufen der Funktion "\textit{set\_txt\_msg(char* msg)}" die Nachricht versenden. Wird eine Nachricht
empfangen so wird diese an die Funktion "\textit{show\_message(char* msg)}" , welcher zur Benutzeroberfläche gehört, übergeben.
Bei der Implementerierung des Nachrichtenversandes ist eine Besonderheit zu erwähnen. Das genutzte Verschlüsselungsverfahren
\textit{Blowfish} wurde seitens der \textit{OpenSSL} Bibliothek als \textit{Blockcipher} implementiert. Das bedeutet, das immer
nur maximal 64 Bit Nachrichten verschlüsselt werden können. Da in der Programmiersprache \textit{C} dies genau acht Zeichen
entspricht, werden alle zu sendenden Nachrichten in Blöcke der Größe acht aufgeteilt, versendet und beim Empfänger wieder
zusammengesetzt. \newline
Ein weiterer wichtiger Unterschied zu den Modulen Senden und Empfangen von \textit{GPS}-Positionen ist die Tatsache, dass bei
diesem Programmteil Sender und Empfänger in der gleichen Datei implementiert wurden. Der Grund hierfür ist, dass man hier nicht
zwischen mehreren Sendern oder Empfängern unterscheiden muss, und diese zwei Teile hier somit nicht komplett getrennt voneinander
arbeiten müssen.

\subsubsection*{Versenden der eigenen Position}

Der benötigte Programmcode zum versenden der eigenen Position ist in der Datei \textit{sender.c} zu finden. Auch hier muss zuerst
eine \textit{IRC-Session} initialisiert werden um danach die Position zu versenden. Der Ablauf beim senden der Positionen erfolgt
in einer vorgegebenen Reihenfolge. Zuerst wird der verschlüsselte Längengrad, danach der verschlüsselte Breitengrade gesendet.
Daraufhin werden solange keine Daten mehr gesendet, bis der Empfänger eine Bestätigung an den \textit{IRC-Kanal} sendet. Diese
Bestätigung ist unverschlüsselt und stellt einfach nur den \textit{Nickname} des Senders dar. Kommt dieses
\textit{Acknowledgement} beim Sender an, so versendet dieser wieder ein \textit{Latitude/Longtitude Paar}.

\subsubsection*{Empfangen der eigenen Position}

noch nicht final....empfänger empfängt nachricht, ordnet sie, leitet sie zum zeichnen weiter....grob gesehen

\subsubsection*{Erstellen eines Barcodes}

Die Datei \textit{barcode.c} beinhaltet die Funktionen zum erstellen eines 2D-Barcodes. Hierzu wird die Funktion
"\textit{generate\_barcode(char* key)}", mit einer Zeichenkette als Übergabeparameter, aufgerufen. Aus dieser Zeichenkette wird
dann ein Barcode erstellt, welcher im darauf folgenden Schritt als \textit{.png} Datei auf das Speichermedium geschrieben wird.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{Analyse}

Im folgenden Teil wird der erzeugte Datenverkehr von \textit{Friend Finder} analysiert. Es wird hierbei vor allem ein
die Packetgröße, sowie die Menge der versendeten Datenpakete analysiert. Der \textit{Traffic} wurde mit Hilfe des Programmes
\textit{Wireshark} \citep{Wireshark} untersucht.\newline

Die Analyse selbst ist in drei Teile aufgeteilt. Als erstes wird auf den allgemein entstehenden Datenverkehr eingegangen, welcher
bei Verbindungsaufbau, sowie bei Beenden der Verbindung entsteht. Der zweite Teil beschäftigt sich mit dem Versenden sowie
Empfangen von Nachrichten. Im letzten Teil dieser Analyse wird auch das dritte Feature, dass Versenden und Empfangen von
Positionen, unter die Lupe genommen.

\subsubsection*{Allgemeiner Datenverkehr}

Wie bereits erwähnt wird zum Versenden der Nachrichten das \textit{IRC-Protokoll} \citep{IRC} verwendet. Dieses Protokoll basiert
\textit{TCP/IP} und führt somit bei Verbindungsaufbau einen \textit{TCP-Handshake} durch. Des weiteren werden
während der gesamten Verbindungsdauer \textit{ACK-} oder \textit{NACK-Pakete} für jede Nachrichten versendet. \newline

Während einer bestehnden Verbindung zu einem \textit{IRC-Server} schicken sich Server und Client fortlaufend Nachrichten. So
sendet der Client zum Beispiel immer eine "Who" Anfrage an den Server, welcher dann mit allen im Channel eingelogten Nutzern
antwortet.\newline

Wird eine bestehnde Verbindung beendet, so entsteht auch hier wieder Datenverkehr, da \textit{TCP} auch beim Beenden einer
Verbindung ein eigenes Verfahren nutz. Bei diesem wird ein Paket versendet welches angibt dass die Verbindung nun beendet wird.
Dieses Paket wird auch wieder bestätigt. Diese beiden Pakete werden von beiden Seiten der Kommunikation versandt.\newline

\subsubsection*{Versenden und Empfangen von Nachrichten}

Um das Versenden von Nachrichten zu evaluieren wurde "Hello World" als Testnachricht benutzt. Der \textit{Blockcipher} von
\textit{Friend Finder} teilt den Satz "Hello World" in zwei Teile auf: "Hello " und "World". Diese werden dann von \textit{TCP}
aufgrund der Fenstergröße in ein Paket gepackt. Das gesamte Paket hat die größe von 81 Bytes, wobei der \textit{TCP-Header} 32
Bytes groß ist. Somit haben die Daten eine Größe von insgesamt 49 Bytes.\newline
Beachtet man dass ein \textit{char} in \textit{C} die Größe von einem Byte hat und der Beispielsatz aus elf Zeichen besteht, so
ist dieser unverschlüsselt 11 Byte groß. Somit vergrößern sich die Daten nach der Verschlüsselung um circa den Faktor 4,5.\newline
Wenn $h$ die Größe des \textit{TCP-Headers} und $t$ die Anzahl der Zeichen der unverschlüsselten Nachricht ist, so ergibt sie die
Länge der zu versendenden Nachricht aus: $h + (t * 4,5)$.

\subsubsection*{Versenden und Empfangen von Positionen}

\subsubsection*{Fazit der Auswertung}

Zur Analyse des Allgemeinen Datenverkehrs ist zu sagen das aufgrund der Tatsache dass das \textit{IRC-Protokoll}
auf \textit{TCP/IP} bassiert, eine großer Overhead an Paketen versandt wird und somit wesentlich mehr Pakete als
nur die benötigten Daten verschickt werden. Hinzu kommen noch Pakete welche zur ständigen Kommunikation zwischen Server und
Client ausgetauscht werden.
%UDP statt TCP???
%streamcipher???
%datenoverhead
%header vergleich datenpart

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
