\chapter{Die Schl"usselverteilzentrale}
\thispagestyle{empty}
\section[Grundlagen des Verfahren]{Grundlagen des Verfahrens}
\subsection{Das Problem}
Jeder Kommunikationspartner \paA{} in einem Netz, der mit einem anderen
Netzteilnehmer \paB{} unter Verwendung des RSA-Verfahrens verschl"usselt
kommunizieren m"ochte, mu"s dazu den "offentlichen Schl"ussel von \paB{}
kennen; ebenso mu"s \paB{} wissen, wie der "offentliche Schl"ussel von
\paA{} lautet. Nach [DATACOM] gibt es folgende drei M"oglichkeiten, wie
die beiden Teilnehmer die Schl"ussel erfahren k"onnen:

\subsubsection{Direkter Austausch}
Beim Verbindungsaufbau tauschen beide Teilnehmer ihre "offentlichen
Schl"ussel direkt aus.

Vorteile:
\begin{itemize}
  \item effizient
  \item geringer Verwaltungsaufwand
  \item keine Schwierigkeiten bei "Anderung des Schl"ussels
\end{itemize}

Nachteile:
\begin{itemize}
  \item fehlende Authentizit"atspr"ufung
\end{itemize}

\subsubsection{lokale Schl"usselverzeichnisse}
Jeder Teilnehmer mu"s die "offentlichen Schl"ussel aller\footnote{
zumindest derer, mit denen er kommunizieren will} anderen Teilnehmer
gespeichert halten.

Vorteile:
\begin{itemize}
  \item besonders einfacher Verbindungsaufbau
  \item eindeutige Authentisierung
\end{itemize}

Nachteile:
\begin{itemize}
  \item hoher Verwaltungsaufwand
  \item Probleme bei "Anderung des Schl"ussels
\end{itemize}

\subsubsection{Schl"usselverteilzentrale}
Beim Verbindungsaufbau erhalten beide Teilnehmer den Schl"ussel des jeweils
Anderen von einer zentralen Stelle.

Vorteile:
\begin{itemize}
  \item Authentizit"atspr"ufung m"oglich
  \item geringer Verwaltungsaufwand
  \item keine Schwierigkeiten bei "Anderung des Schl"ussels
\end{itemize}

Nachteile:
\begin{itemize}
  \item keine gravierenden Nachteile
\end{itemize}

\subsection{Die L"osung}
In der Aufgabenstellung f"ur unsere Studienarbeit wurde die Verwendung einer
Schl"usselverteilzentrale mit einseitiger Teilnehmerkommunikation
vorgeschrieben, das hei"st, nur der Teilnehmer \paA{} nimmt Verbindung mit
der Schl"usselverteilzentrale \paZ{} auf.

\section{Das Verfahren}
Eine ausf"uhrliche Beschreibung des verwendeten Verfahrens findet sich in
[DATACOM 3.4.4]. Grunds"atzlich l"auft ein Verbindungsaufbau wie folgt ab:

\begin{enumerate}
  \item \paA{} schickt eine Nachricht an \paZ{}, aus der hervorgeht, da"s
        \paA{} mit \paB{} kommunizieren m"ochte.
  \item \paZ{} antwortet mit einer Nachricht an \paA{}, die aus zwei Zertifikaten
        zusammengesetzt ist; das erste Zertifikat ist f"ur \paA{} bestimmt
        und enth"alt unter Anderem den "offentlichen Schl"ussel von \paB{}.
        Das zweite Zertifikat ist f"ur \paB{} bestimmt und enth"alt unter
        Anderem den "offentlichen Schl"ussel von \paA{}.
  \item \paA{} wertet das f"ur ihn bestimmte Zertifikat aus und schickt das
        zweite an \paB{} weiter.
  \item \paB{} wertet das Zertifikat aus.
  \item \paA{} erzeugt eine Kontrollmeldung f"ur \paB{}.
  \item \paB{} wertet die Kontrollmeldung von \paA{} aus. In diesem Moment hat
        \paB{} \paA{} bereits authentisiert.
  \item \paB{} erzeugt nun eine Kontrollmeldung f"ur \paA{}.
  \item \paA{} wertet die Kontrollmeldung von \paB{} aus. In diesem Moment hat
        \paA{} \paB{} ebenfalls authentisiert.
\end{enumerate}

Die gegenseitige Authentisierung erfolgt durch digitale Unterschriften.

\section{Die Implementation}
\subsection{"Uberblick}
S"amtliche Prozeduren, die zum Betrieb der Schl"usselverteilzentrale ben"otigt
werden, befinden sich im Modul \ident{KeyMaster}. Da die Prozeduren, die von
den Kommunikationsteilnehmern benutzt werden m"ussen, sich davon nur
unwesentlich unterscheiden, wurden auch sie in das Modul \ident{KeyMaster}
integriert.

Das Modul \ident{KeyMaster} importiert neben den  Standard-Bibliotheksmoduln
nur das Modul \ident{RSA} von Steffen Reith. Dieses Modul enth"alt eine
Schnittstelle zu den zur Ver-- und Entschl"usselung ben"otigten Prozeduren auf
relativ hoher Ebene.

Zur Demonstration des Verfahrens wurden au"serdem vier weitere Moduln
implementiert, n"amlich \ident{A}, \ident{B}, \ident{C} und \ident{Schedule}.
Diese demonstrieren den Ablauf eines Kommunikationsvorganges auf einem
einzigen Rechner. Die Kommunikationsteilnehmer werden von verschiedenen
Moduln simuliert, die Daten"ubertragungen "uber das Netz durch Zwischenspeicherung
der Daten in Files. Die Moduln \ident{A} und \ident{B} enthalten die Steuerung
eines Kommunikationsablaufs f"ur jeweils einen der Teilnehmer \paA{} und \paB{},
das Modul \ident{C} enth"alt die Schl"usselverteilzentrale \paZ{}, und das Modul
\ident{Schedule} aktiviert nacheinander die jeweils ben"otigten Routinen von
\ident{A}, \ident{B} und \ident{C}.

\subsection{Datentypen}
\subsubsection{Dirty--Typen} \label{dirty}
F"ur alle Datenstrukturen, die \paZ{} ben"otigt, wurden entsprechende Datentypen
deklariert. Leider konnten diese Datentypen nicht durchgehend verwendet werden,
denn durch die Verschl"usselung der Daten "andert sich auch die L"ange (der
Speicherbedarf) dieser Objekte ($\longrightarrow{}\ref{unterschriften}$). Daher
wurde f"ur die Behandlung verschl"usselter Daten ein quasi--generischer
Datentyp \ident{Dirty} deklariert; dieser Typ ist einfach ein roher,
unstrukturierter Datenblock vom Typ ARRAY OF BYTE.

S"amtliche Typen und Prozeduren, die in ihrem Namen das Wort "`Dirty"' enthalten,
beziehen sich auf die Behandlung solcher unstrukturierter Bl"ocke.

\subsubsection{Stamp} \label{stamp}
Der Datentyp \ident{Stamp} dient zur Speicherung eines sogenannten Zeitstempels.
Diese Zeitstempel werden einerseits angegeben, um sicherzustellen, da"s die
Nachricht, die diesen Stempel tr"agt, nicht zu alt ist\footnote{
es handelt sich sozusagen um ein "`Haltbarkeitsdatum"'\dots{}}, andererseits sind
sie auch ein wichtiger Bestandteil der digitalen Unterschriften ($\longrightarrow
\ref{unterschriften}$). Jeder \ident{Stamp} besteht aus zwei INTEGER--Zahlen, die
das Absende--Datum in Zahlenform enthalten.

\subsubsection{Registration}
Der Datentyp \ident{Registration} wird f"ur die Anmeldung der einzelnen Teilnehmer
bei der Zentrale benutzt. Bevor ein Verbindungsaufbau zwischen den Teilnehmern
stattfinden kann, m"ussen diese nat"urlich als erstes der Zentrale ihre
"offentlichen Schl"ussel mitteilen. Die \ident{Registration} enth"alt die
Teilnehmernummer und den "offentlichen Schl"ussel des Absenders.

\subsubsection{KeyRequestData}
Der Datentyp \ident{KeyRequestData} wird f"ur die Schl"usselanforderung
von \paA{} an \paZ{} ben"otigt. Er enth"alt die Benutzernummern von \paA{}
und \paB{}, sowie einen Zeitstempel.

\subsubsection{Certificate}
Der Datentyp \ident{Certificate} ist die zentrale Datenstruktur, die f"ur den
Verbindungsaufbau benutzt wird. \paZ{} schickt zwei dieser Zertifikate an
\paA{} und \paA{} schickt das zweite dieser beiden an paB{}. Auch die
Kontrollmeldungen, die paA{} und \paB{} noch austauschen, sind vom Typ
\ident{Certificate}.

Ein Zertifikat enth"alt die Teilnehmernummer eines der Teilnehmer\footnote{
welche, h"angt vom Zweck des Zertifikates ab}, einen "offentlichen Schl"ussel
eines Teilnehmers\footnote{ebenfalls abh"angig vom Zweck des Zertifikates}, sowie
einen Zeitstempel und eine digitale Unterschrift\label{unterschriften}. Die
digitale Unterschrift entsteht, indem der Zeitstempel mit einem privaten
Schl"ussel verschl"usselt und in das Datenfeld \ident{signature} eingetragen
wird. Man beachte, da"s dieses Feld zwar formal als \ident{Stamp}
($\longrightarrow{}\ref{stamp}$) deklariert ist, aber mit gutem Grund an letzter
Stelle im RECORD steht: wie bereits erw"ahnt, "andert sich durch die
Verschl"usselung der Speicherbedarf dieser Unterschrift. Das Eintragen der
Unterschrift erfolgt im Programm daher auch nicht in eine Variable von Typ
\ident{Certificate}, sondern das Zertifikat wird vorher in einen
\ident{Dirty}--Block ($\longrightarrow{}\ref{dirty}$) kopiert.

\subsubsection{MessageType}
Dieser Datentyp dient als Typ--Kennung f"ur die einzelnen Nachrichten, die beim
Verbindungsaufbau ausgetauscht werden. Ein Byte mit einem der Werte dieses
Aufz"ahlungstyps wird jeder Nachricht vorangestellt, sofern Sie mit den
Prozeduren des Moduls \ident{KeyMaster} erzeugt und abgeschickt wird. Nur durch
dieses Kennbyte kann der Empf"anger der Nachricht feststellen, von welcher
Art die nachfolgende Nachricht ist.

\subsection{Prozeduren}
Bei diesen Prozeduren wurden alle Parameter, die in ihrem Umfang eine L"ange
von wenigen Bytes "uberschreiten, als "`VAR"'-Parameter (CALL BY REFERENCE)
deklariert, einerseits, um das Laufzeitverhalten zu verbessern, vor allem aber,
um nicht mit der unter MS--DOS g"ultigen Beschr"ankung der Stack--Gr"o"se in
Konflikt zu geraten. Die Alternative h"atte darin bestanden, "ahnlich wie in
C explizit Zeiger zu "ubergeben; etwas anderes geschieht aber bei CALL BY
REFERENCE auch nicht, nur die Schreibweise ist wesentlich eleganter, da die
Zeiger implizit gehandhabt werden, ohne da"s der Programmierer sich weiter
darum k"ummern mu"s.

Bei den Beschreibungen der Prozeduren wird \paA{} als Bezeichnung f"ur den
Kommunikationsteilnehmer benutzt, der die Schl"ussel bei \paZ{} anfordert,
und \paB{} als Bezeichnung f"ur den anderen (passiven) Partner.

\subsubsection{HandleRegistration}
Diese Prozedur wird von \paZ{} benutzt, um die Anmeldung eines der
Kommunikationspartner zu behandeln. Es m"ussen die Kennung des Eingabefiles
und der "offentliche Schl"ussel von \paZ{} "ubergeben werden.

\subsubsection{DecodeKeyMessageAB}
\paA{} benutzt diese Prozedur, um seinen Anteil aus der \ident{KeyMessage} zu
extrahieren, die \paZ{} zusammengestellt hat. Es m"ussen die
\ident{KeyMessage} selbst, der geheime Schl"ussel von \paA{} und der "offentliche
Schl"ussel von \paZ{} "ubergeben werden. Als Ergebnisse erh"alt man das
vollst"andig entschl"usselte Zertifikat A, das teilweise entschl"usselte
Zertifikat B und die L"ange von Zertifikat B (in Bytes) zur"uck.

\subsubsection{DecodeKeyMessageB}
\paB{} benutzt diese Prozedur, um seinen Anteil der \ident{KeyMessage} von \paZ{},
den ihm \paA{} geschickt hat, auszuwerten. "Ubergeben werden m"ussen neben
der Nachricht selbst der geheime Schl"ussel von \paB{} und der "offentliche
Schl"ussel von \paZ{}. Als Ergebnis erh"alt man das vollst"andig entschl"usselte
Zertifikat B zur"uck.

\subsubsection{SendKeyMessage}
Der Name dieser Prozedur stellt ein leichtes Understatement dar, denn hier
wird der ankommende \ident{KeyRequest} von \paZ{} analysiert, es werden beide
Zertifikate (je eines f"ur \paA{} und \paB{}) erzeugt, zusammengestellt und
schlie"slich abgeschickt. Dazu m"ussen die Eingabedatei, die den
\ident{KeyRequest} enth"alt, und der geheime Schl"ussel von \paZ{} "ubergeben
werden.

\subsubsection{PutKeyMessageB}
\paA{} benutzt diese Prozedur, um den zweiten Teil der \ident{KeyMessage}
weiter an \paB{} zu schicken. "Ubergeben werden m"ussen die Ausgabedatei,
das Zertifikat B und die L"ange des Zertifikats (in Bytes).

\subsubsection{SendKeyRequest}
\paA{} benutzt diese Prozedur, um die Schl"usselanforderung f"ur den
Verbindungsaufbau zwischen \paA{} und \paB{} zu erzeugen und an \paZ{} zu
schicken. Es m"ussen die Teilnehmernummern von \paA{} und \paB{}, sowie der
"offentliche Schl"ussel von \paZ{} "ubergeben werden.

\subsubsection{SendRegistration}
Diese Prozedur wird sowohl von \paA{} als auch von \paB{} benutzt, um sich zu
Beginn der Kommunikation bei \paZ{} anzumelden. Es m"ussen die Teilnehmernummer
des Kommunikationsteilnehmers und sein "offentlicher Schl"ussel "ubergeben werden.

\subsubsection{BuildDupMsg}
Sowohl \paA{} als auch \paB{} benutzen diese Prozedur, um die Kontrollmeldungen
zu erzeugen, die im Rahmen der gegenseitigen Authentisierung ausgetauscht werden.

Wenn \paA{} die \ident{DupMessage} erzeugt, m"ussen die Teilnehmernummer von \paA{},
"offentlicher und geheimer Schl"ussel von \paA{} und "offentlicher Schl"ussel von
\paB{} "ubergeben werden.

Wenn \paB{} die \ident{DupMessage} erzeugt, m"ussen die Teilnehmernummer von \paA{},
"offentlicher Schl"ussel von \paA{}, geheimer Schl"ussel von \paB{} und nochmals
der "offentliche Schl"ussel von \paA{} "ubergeben werden.

In beiden F"allen erh"alt man die fertige \ident{DupMessage}, sowie ihre L"ange
(in Bytes) als Ergebnis zur"uck.

\subsubsection{DecodeDupMsg}
Sowohl \paA{} als auch \paB{} benutzen diese Prozedur, um die Kontrollmeldungen
auszuwerten, die im Rahmen der gegenseitigen Authentisierung ausgetauscht werden.

Wenn \paA{} die \ident{DupMessage} von \paB{} auswertet, m"ussen als Parameter
der "offentliche Schl"ussel von \paB{} und der geheime Schl"ussel von \paA{}
"ubergeben werden.

Wenn \paB{} die \ident{DupMessage} von \paA{} auswertet, m"ussen als Parameter
der "offentliche Schl"ussel von \paA{} und der geheime Schl"ussel von \paB{}
"ubergeben werden.

Als Ergebnis erh"alt man das vollst"andig entschl"usselte Zertifikat zur"uck,
das in der \ident{DupMessage} enthalten war.

\subsubsection{SendDupMsg}
Diese Prozedur wird sowohl von \paA{} als auch von \paB{} benutzt, um die
fertig verschl"usselte \ident{DupMessage} abzuschicken. "ubergeben werden m"ussen
die Ausgabedatei, die \ident{DupMessage} und ihre L"ange (in Bytes).
