-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathVerschluesselung.tex
105 lines (84 loc) · 8.9 KB
/
Verschluesselung.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
\section{Verschlüsselungsschema}
\label{sec:schema}
Nachdem eine Nachricht aus dem Message Space --- wie in Abschnitt \ref{sec:dte} beschrieben --- durch eine DTE auf den Seed Space abgebildet wurde, folgt die Verschlüsselung des Ergebnisses. Hierfür schlagen die Autoren in \cite{EURO2014} zwei verschiedene Vorgehensweisen vor. Die unter Verwendung dieser Vorgehensweisen entstehenden Honey Encryption-Schemata werden im Folgenden dargestellt. Zuvor wird noch kurz auf die in den Schemata verwendeten Verfahren eingegangen.
\subsection{Verwendete Verfahren}
\subsubsection*{XOR}
Die XOR-(Exklusiv-ODER-)Verknüpfung ist ein bitweiser Operator, der für zwei unterschiedliche Eingangsbits $1$ ergibt und ansonsten $0$. Seine besondere Bedeutung für die Kryptographie liegt in dem Zusammenhang \(K \oplus K = 0\) und somit \((M \oplus K) \oplus K = M\), dass heißt zweifache Verknüpfung von M mit dem Bitstring K ergibt wiederum M. Diese zweifache Verknüpfung lässt sich als Ver- und Entschlüsselung interpretieren, wie es beispielsweise beim One Time Pad geschieht \cite{Schneier2006}.%S.15-20
\subsubsection*{Hashfunktion}
Eine Hashfunktion ist eine Funktion, die eine Eingabe variabler Länge auf einen String fester Länge abbildet.
In der Kryptographie werden insbesondere Einweg-Hashfunktionen eingesetzt. Bei dieser Art von Hashfunktionen ist es leicht, aus einer Eingabe den Hashwert zu berechnen, jedoch sehr schwer, zu einem gegebenen Hashwert eine Eingabe zu finden, die auf diesen Wert abgebildet wird \cite{Schneier2006}. Beispiele für heute verwendete Hashfunktionen sind MD5 und SHA256.
\subsubsection*{Blockchiffre}
Bei Blockchiffren handelt es sich um symmetrische Verschlüsselungsalgorithmen, die Nachrichten in Blöcken fester Größe verschlüsseln. Es gilt \(\text{Enc}_K(M)=C\) und \(\text{Dec}_K(C)=M\). Hierbei steht \(M\) für die Nachricht, \(K\) für den Schlüssel, der verwendet wird, \(C\) für den Chiffretext und Enc bzw. Dec für die Ver- bzw. Entschlüsselung\cite{Schneier2006}.
\subsubsection*{Betriebsmodi für Blockchiffren}
Kryptographische Modi sind Verfahren, die das Verschlüsseln einer Nachricht per Blockchiffre beschreiben. Sie verknüpfen die Blockchiffre normalerweise mit einer Rückkopplung und wenigen einfachen Operationen. Beispiele für Modi sind CBC (Cipher Block Chaining - XOR-Verknüpfung des zuletzt erhaltenen Chiffretexts mit dem nächsten Klartextblock vor seiner Verschlüsselung) oder CTR (Counter Mode - Verschlüsselung eines Initialisierungsvektors und eines blockweise erhöhten Zählers mit dem Schlüssel und anschließende XOR-Verknüpfung des erhaltenen Zwischenschlüssels mit dem Klartextblock) \cite{Schneier2006}.
\subsubsection*{Password Based Key Derivation Function}
Password Based Key Derivation Functions leiten aus einem Passwort (und möglichen anderen Parametern) einen Schlüssel ab, der dann beispielsweise in symmetrischen Algorithmen weiter verwendet werden kann.
Derzeitige Empfehlung ist die Verwendung von PBKDF2. Innerhalb dieses Algorithmus wird mehrfach eine pseudozufällige Funktion auf die Eingangswerte angewendet. Durch diese Erhöhung der Berechnungszeit steigt der Aufwand für Brute-Force-Angriffe auf Verschlüsselungen, die dieses Verfahren nutzen, stark an \cite{pbkdf2000}.
\subsection{Hashbasierte Verschlüsselung}
Das erste Verfahren nutzt zur Verschlüsselung die XOR-Verknüpfung des aus der Nachricht erhaltenen Seeds \(S\) mit einem Hash des Schlüssels \(K\) (Abbildung \ref{fig:HashEnc}).
\begin{figure}[h]
\begin{minipage}[b]{0.5\textwidth}
\begin{align*}
\text{HEnc}&_{\text{Hash}}(M, K)\\
&S \overset{<r>}{=} \text{DTE}_{\text{encode}}(M)\\ %Encoding
&K_D = \text{PBKDF}(K)\\ %PBKDF2
&R \overset{<r>}{=} \{0,1\}^k\\ %Random
&H = \text{HF}(K_D,R)\\ %Hash
&C = H \oplus S\\ %XOR
&\text{Return } (C,R)
\end{align*}
\caption{Hashbasierte Verschlüsselung}
\label{fig:HashEnc}
\end{minipage}
\begin{minipage}[b]{0.5\textwidth}
\begin{align*}
\text{HDec}&_{\text{Hash}}((C,R), K)\\
&K_D = \text{PBKDF}(K)\\ %PBKDF2
&H = \text{HF}(K_D,R)\\ %Hash
&S = H \oplus C\\ %XOR
&M = \text{DTE}_{\text{decode}}(S)\\ %Decoding
&\text{Return } M
\end{align*}
\caption{Hashbasierte Entschlüsselung}
\label{fig:HashDec}
\end{minipage}
\end{figure}
Nach der Kodierung der Nachricht durch die DTE wird der Schlüssel zum Erschweren von Brute-Force-Angriffen durch eine Password Based Key Derivation Function auf den Bitstring \(K_D\) abgebildet. Es wird ein zufälliger Bitstring \(R\) gewählt, der zusammen mit \(K_D\) durch die Hashfunktion HF auf \(H\) abgebildet wird. Dieser zufällige Bitstring sorgt dafür, dass auch bei der Verschlüsselung gleicher Nachrichten mit gleichem Schlüssel unterschiedliche Chiffretexte entstehen. Er kann je nach Bedarf in der Länge \(k\) variiert werden. Der errechnete Hash \(H\) wird nun mit dem im ersten Schritt erhaltenen Seed \(S\) XOR-verknüpft und bildet den Chiffretext \(C\). Dieser kann nun zusammen mit dem Bitstring \(R\) gespeichert oder übertragen werden.
Zur Entschlüsselung wird das Verfahren in ähnlicher Weise durchlaufen (Abbildung \ref{fig:HashDec}). Der Schlüssel \(K\) wird wie bei der Verschlüsselung durch eine Password Based Key Derivation Function auf den Bitstring \(K_D\) abgebildet. Zusammen mit dem übergebenen Bitstring \(R\) wird durch HF der Hash \(H\) gebildet. Durch eine XOR-Verknüpfung von \(H\) mit \(C\) erhält man den ursprünglichen Seed \(S\). Dieser kann dann durch die DTE dekodiert werden und es ergibt sich wieder die Nachricht \(M\).
\subsection{Auf Blockchiffren basierte Verschlüsselung}
Für die Verschlüsselung können jedoch auch Blockchiffren genutzt werden. Hierbei muss aber beachtet werden, dass der Eingangsraum der Blockchiffre gleich dem Seed Space sein muss und alle Ciphertexte unter allen möglichen Schlüsseln zu Werten aus dem Seed Space entschlüsselt werden müssen.
Im Folgenden wird das Schema unter Nutzung einer Blockchiffre mit dem CTR-Modus skizziert. Andere Betriebsmodi sollten ebenfalls nutzbar sein. So erwähnen die Autoren in \cite{EURO2014} explizit den CBC-Modus, weisen jedoch auch darauf hin, dass die Länge eines Seeds in diesem Fall ein Vielfaches der Blocklänge der Blockchiffre sein muss, so dass kein Padding \footnote{Als Padding werden die zum Auffüllen des letzten, nicht vollständig belegten Blocks verwendeten Bits bezeichnet, die benötigt werden, wenn die Länge der Nachricht kein Vielfaches der Blocklänge ist.} benötigt wird.
\begin{figure}[h]
\begin{minipage}[b]{0.5\textwidth}
\begin{align*}
\text{HEnc }&_{\text{Block}}(M, K)\\
&S \overset{<r>}{=} \text{DTE}_{\text{encode}}(M)\\ %Encoding
&R \overset{<r>}{=} \{0,1\}^k\\ %Random
&K' = \text{HF}(K,R)\\ %Hash
&P = \epsilon \\
&\text{For } i = 1 \text{ to } \left\lceil \frac{|S|}{n} \right\rceil \\
&\qquad P = P \text{ || Enc}(K',i)\\ %Enc
&C = P[1 .. |S|] \oplus S\\ %XOR
&\text{Return } (C,R)
\end{align*}
\caption{Verschlüsselung mit \\Blockchiffre (CTR-Modus)}
\label{fig:BlockEnc}
\end{minipage}
\begin{minipage}[b]{0.5\textwidth}
\begin{align*}
\text{HDec }&_{\text{Block}}((C,R), K)\\
&K' = \text{HF}(K,R)\\ %Hash
&P = \epsilon \\
&\text{For } i = 1 \text{ to } \left\lceil \frac{|S|}{n} \right\rceil \\
&\qquad P = P \text{ || Enc}(K',i)\\ %Enc
&S = P[1 .. |S|] \oplus C\\ %XOR
&M = \text{DTE}_{\text{decode}}(S)\\ %Encoding
&\text{Return } M
\end{align*}
\caption{Entschlüsselung mit \\Blockchiffre (CTR-Modus)}
\label{fig:BlockDec}
\end{minipage}
\end{figure}
Sowohl bei der Ver- als auch bei der Entschlüsselung wird zum Erzeugen eines Schlüsselstroms (gemäß dem CTR-Modus für Blockchiffren) gleich vorgegangen (sieht man einmal von der Erzeugung des zufälligen Bitstrings \(R\) der Länge \(k\) während der Verschlüsselung ab, der aus dem gleichen Grund wie bei dem hashbasierten Verfahren genutzt wird). Aus \(R\) und dem Schlüssel \(K\) wird durch eine Hashfunktion der Schlüssel \(K'\) generiert. Der Schlüsselstrom \(P\) wird leer initialisiert. Nun wird eine Schleife so oft durchlaufen wie Blöcke der Länge \(n\) (Blocklänge der verwendeten Blockchiffre) notwendig sind, um mindestens die Länge eines Seedwertes (\(|S|\)) zu erreichen. In jedem Durchlauf wird an \(P\) die Blockverschlüsselung von \(K'\) und dem Schleifenzähler \(i\) angehängt.
Bei der Verschlüsselung (Abbildung \ref{fig:BlockEnc}) wird der aus der Kodierung entstandene Seed \(S\) mit den \(|S|\) ersten Bits des wie bereits beschrieben berechneten Schlüsselstroms \(P\) XOR-verknüpft und bildet so den Chiffretext \(C\), der zusammen mit \(R\) nun gespeichert oder übertragen werden kann.
Bei der Entschlüsselung (Abbildung \ref{fig:BlockDec}) müssen nach Berechnung des Schlüsselstroms \(P\) nur noch die \(|S|\) ersten Bits von \(P\) mit \(C\) XOR-verknüpft werden und man erhält den ursprünglichen Seed \(S\). Dieser kann dann durch die DTE dekodiert werden und es ergibt sich wieder die Nachricht \(M\).