aboutsummaryrefslogtreecommitdiffstats
path: root/buch/papers/mceliece/funktionsweise.tex
blob: 4a8a71f2235c0571b29fd795dc0062ea3cfea755 (plain)
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
%
% teil2.tex -- Beispiel-File für teil2 
%
% (c) 2020 Prof Dr Andreas Müller, Hochschule Rapperswil
%
\section{Funktionsweise 
\label{mceliece:section:funktionsweise}}
\rhead{Funktionsweise}
Um den Ablauf des Datenaustausches mittels McEliece-Verschlüsselung zu erläutern,
wird ein Szenario verwendet,
bei dem Bob an Alice eine verschlüsselte Nachricht über ein öffentliches Netzwerk zukommen lässt.

\subsection{Vorbereitung
\label{mceliece:section:vorbereitung}}
Bevor einen Datenaustausch zwischen Sender und Empfänger stattfinden kann,
muss abgemacht werden, welche Länge $n$ das Code-Wort und welche Länge $k$ das Datenwort hat
und wie viele Bitfehler $t$ (angewendet mit Fehlervektor $e_n$)
für das Rauschen des Code-Wortes $c_n$ verwendet werden.
Danach generiert Alice (Empfängerin) ein Schlüsselpaar.
Dazu erstellt sie die einzelnen Matrizen $S_k$, $G_{n,k}$ und $P_n$.
Diese drei Matrizen bilden den privaten Schlüssel von Alice
und sollen geheim bleiben.
Der öffentliche Schlüssel $K_{n,k}$ hingegen berechnet sich
aus der Multiplikation der privaten Matrizen (Abschnitt \ref{mceliece:subsection:k_nk})
und wird anschliessend Bob zugestellt.

\subsection{Verschlüsselung
\label{mceliece:section:verschl}}
Bob berechnet nun die verschlüsselte Nachricht $c_n$, indem er seine Daten $d_k$
mit dem öffentlichen Schlüssel $K_{n,k}$ von Alice multipliziert
und anschliessend durch eine Addition mit einem Fehlervektor $e_n$ einige Bitfehler hinzufügt:
\[
    c_n=K_{n,k}\cdot d_k + e_n.
\]
Dabei wird für jede Nachricht (oder für jedes Nachrichtenfragment) $d_k$
ein neuer, zufälliger Fehlervektor generiert.
Die verschlüsselte Nachricht $c_n$ wird anschliessend Alice zugestellt.

\subsection{Entschlüsselung
\label{mceliece:section:entschl}}
Alice entschlüsselt die erhaltene Nachricht in mehreren einzelnen Schritten.
Um etwas Transparenz in diese Prozedur zu bringen, wird der öffentliche Schlüssel $K_{n,k}$ mit seinen Ursprungsmatrizen dargestellt:
\begin{align*}
    c_n&=K_{n,k}\cdot d_k + e_n \\
    &= P_{n}\cdot G_{n,k}\cdot S_{k}\cdot d_k + e_n.
\end{align*}
Zuerst wird der Effekt der Permutationsmatrix rückgängig gemacht,
indem das Codewort mit der Inversen $P_n^{-1}$ multipliziert wird:
\begin{align*}
    c_{n}''=P_n^{-1}\cdot c_n&= P_n^{-1}\cdot P_{n}\cdot G_{n,k}\cdot S_{k}\cdot d_k + P_n^{-1}\cdot e_n \\
                                         &= G_{n,k}\cdot S_{k}\cdot d_k + P_n^{-1}\cdot e_n.
\end{align*}
Eine weitere Vereinfachung ist nun möglich,
weil $P_n^{-1}$ einerseits auch eine gewöhnliche Permutationsmatrix ist
und andererseits ein zufälliger Fehlervektor $e_n$ multipliziert mit einer Permutationsmatrix
wiederum einen zufälligen Fehlervektor gleicher Länge und mit der gleichen Anzahl Fehlern $e_n'$ ergibt:
\begin{align*}
    c_{n}''&=G_{n,k}\cdot S_{k}\cdot d_k + P_n^{-1}\cdot e_n \\
             &=G_{n,k}\cdot S_{k}\cdot d_k + e'_n \quad \text{mit} \quad
    e'_n=P_n^{-1}\cdot e_n.
\end{align*}
Dank des fehlerkorrigierenden Codes, der durch die implizite Multiplikation mittels $G_{n,k}$ auf die Daten angewendet wurde,
können nun die Bitfehler, verursacht durch den Fehlervektor $e'_n$,
entfernt werden.
Da es sich bei diesem Schritt nicht um eine einfache Matrixmultiplikation handelt,
wird die Operation durch eine Funktion dargestellt.
Wie dieser Decoder genau aufgebaut ist,
hängt vom verwendeten Linearcode ab:
\begin{align*}
    c_{k}'&=\text{Linear-Code-Decoder}(c''_n)\\
            &=\text{Linear-Code-Decoder}(G_{n,k}\cdot S_{k}\cdot d_k + e'_n)\\
            &=S_{k}\cdot d_k.
\end{align*}
Zum Schluss wird das inzwischen fast entschlüsselte Codewort $c'_k$ mit der Inversen der zufälligen Binärmatrix $S^{-1}$ multipliziert,
womit der Inhalt der ursprünglichen Nachricht nun wiederhergestellt wurde:
\begin{equation*}
    d'_{k}=S_{k}^{-1} \cdot c'_k=S_{k}^{-1} \cdot S_{k}\cdot d_k
                                    =d_k.
\end{equation*}
Möchte ein Angreifer die verschlüsselte Nachricht knacken, muss er die drei privaten Matrizen $S_k$, $G_{n,k}$ und $P_n$ kennen.
Aus dem öffentlichen Schlüssel lassen sich diese nicht rekonstruieren
und eine systematische Analyse der Codeworte wird durch das Hinzufügen von zufälligen Bitfehlern zusätzlich erschwert.

\subsection{Beispiel}
Die Verschlüsselung soll mittels eines numerischen Beispiels demonstriert werden. 
Der verwendete Linear-Code wird im Abschnitt \ref{mceliece:subsection:seven_four} beschrieben.
\begin{itemize}
    \item Daten- und Fehlervektor
%    \begin{itemize}
%        \item[]
        \[d_4=
        \begin{pmatrix}
            1\\
            1\\
            1\\
            0 
        \end{pmatrix}
        ,\quad
        e_7=
        \begin{pmatrix}
            0\\
            0\\
            1\\
            0\\
            0\\
            0\\
            0
        \end{pmatrix}.
        \]
%    \end{itemize}
    \item Private Matrizen:
\begin{gather*}
%    \begin{itemize}
%        \item[]
        S_4=
            \begin{pmatrix}
                0 & 0 & 1 & 1\\
                0 & 0 & 0 & 1\\
                0 & 1 & 0 & 1\\
                1 & 0 & 0 & 1
            \end{pmatrix},\quad
            S_4^{-1}=
            \begin{pmatrix}
                0 & 1 & 0 & 1\\
                0 & 1 & 1 & 0\\
                1 & 1 & 0 & 0\\
                0 & 1 & 0 & 0\\
            \end{pmatrix},
	\\
%        \item[]
            G_{7,4}=
            \begin{pmatrix}
                1 & 0 & 0 & 0\\
                1 & 1 & 0 & 0\\
                0 & 1 & 1 & 0\\
                1 & 0 & 1 & 1\\
                0 & 1 & 0 & 1\\
                0 & 0 & 1 & 0\\
                0 & 0 & 0 & 1
            \end{pmatrix},
	\\
%        \item[]
            P_7=
            \begin{pmatrix}
                0 & 1 & 0 & 0 & 0 & 0 & 0\\
                0 & 0 & 0 & 0 & 0 & 0 & 1\\
                1 & 0 & 0 & 0 & 0 & 0 & 0\\
                0 & 0 & 0 & 1 & 0 & 0 & 0\\
                0 & 0 & 0 & 0 & 0 & 1 & 0\\
                0 & 0 & 1 & 0 & 0 & 0 & 0\\
                0 & 0 & 0 & 0 & 1 & 0 & 0
            \end{pmatrix},
        \quad
            P_7^{-1}=P_7^t=
            \begin{pmatrix}
                0 & 0 & 0 & 0 & 0 & 1 & 0\\
                1 & 0 & 0 & 0 & 0 & 0 & 0\\
                0 & 0 & 0 & 1 & 0 & 0 & 0\\
                0 & 0 & 0 & 0 & 1 & 0 & 0\\
                0 & 0 & 0 & 0 & 0 & 0 & 1\\
                0 & 0 & 1 & 0 & 0 & 0 & 0\\
                0 & 1 & 0 & 0 & 0 & 0 & 0
            \end{pmatrix}.
        \\
%    \end{itemize}
\end{gather*}
    \item Öffentlicher Schlüssel:
\index{Schlüssel, öffentlicher}%
\index{öffentlicher Schlüssel}%
%    \begin{itemize}
%        \item[]
        \begin{align*}
            K_{7,4}&=P_{7}\cdot G_{7,4}\cdot S_{4}=\\
            \begin{pmatrix} %k
                0 & 0 & 1 & 0\\
                1 & 0 & 0 & 1\\
                0 & 0 & 1 & 1\\
                1 & 1 & 1 & 1\\
                0 & 1 & 0 & 1\\
                0 & 1 & 0 & 0\\
                1 & 0 & 0 & 0
            \end{pmatrix}
            &=
            \begin{pmatrix} %p
                0 & 1 & 0 & 0 & 0 & 0 & 0\\
                0 & 0 & 0 & 0 & 0 & 0 & 1\\
                1 & 0 & 0 & 0 & 0 & 0 & 0\\
                0 & 0 & 0 & 1 & 0 & 0 & 0\\
                0 & 0 & 0 & 0 & 0 & 1 & 0\\
                0 & 0 & 1 & 0 & 0 & 0 & 0\\
                0 & 0 & 0 & 0 & 1 & 0 & 0
            \end{pmatrix}
            \cdot
            \begin{pmatrix} %g
                1 & 0 & 0 & 0\\
                1 & 1 & 0 & 0\\
                0 & 1 & 1 & 0\\
                1 & 0 & 1 & 1\\
                0 & 1 & 0 & 1\\
                0 & 0 & 1 & 0\\
                0 & 0 & 0 & 1
            \end{pmatrix}
            \cdot
            \begin{pmatrix} %s
                0 & 0 & 1 & 1\\
                0 & 0 & 0 & 1\\
                0 & 1 & 0 & 1\\
                1 & 0 & 0 & 1
            \end{pmatrix}
            .
        \end{align*}
%    \end{itemize}
    \item Verschlüsselung:
%    \begin{itemize}
%        \item[]
        \begin{align*}
            c_7&=K_{7,4}\cdot d_4 + e_7=\\
        \begin{pmatrix} %c
            1\\
            1\\
            0\\
            1\\
            1\\
            1\\
            1
        \end{pmatrix}
        &=
        \begin{pmatrix} %k
            0 & 0 & 1 & 0\\
            1 & 0 & 0 & 1\\
            0 & 0 & 1 & 1\\
            1 & 1 & 1 & 1\\
            0 & 1 & 0 & 1\\
            0 & 1 & 0 & 0\\
            1 & 0 & 0 & 0
        \end{pmatrix}
        \cdot
        \begin{pmatrix} %d
            1\\
            1\\
            1\\
            0 
        \end{pmatrix}
        +
        \begin{pmatrix} %e
            0\\
            0\\
            1\\
            0\\
            0\\
            0\\
            0
        \end{pmatrix} 
        .
        \end{align*}
%    \end{itemize}
    \item Entschlüsselung (Permutation rückgängig machen):
%    \begin{itemize}
%        \item[]
        \begin{align*}
            c_{7}''&=P_7^{-1}\cdot c_7=\\
            \begin{pmatrix} %c''
                0\\
                1\\
                1\\
                1\\
                1\\
                1\\
                1
            \end{pmatrix}
            &=
            \begin{pmatrix} %p^-1
                0 & 0 & 1 & 0 & 0 & 0 & 0\\
                1 & 0 & 0 & 0 & 0 & 0 & 0\\
                0 & 0 & 0 & 0 & 0 & 1 & 0\\
                0 & 0 & 0 & 1 & 0 & 0 & 0\\
                0 & 0 & 0 & 0 & 0 & 0 & 1\\
                0 & 0 & 0 & 0 & 1 & 0 & 0\\
                0 & 1 & 0 & 0 & 0 & 0 & 0
            \end{pmatrix}
            \cdot
            \begin{pmatrix} %c
                1\\
                1\\
                0\\
                1\\
                1\\
                1\\
                1
            \end{pmatrix}
            .
        \end{align*}
%    \end{itemize}
    \item Entschlüsselung (Bitfehlerkorrektur mit Linearcode):
%    \begin{itemize}
%        \item[]
        \begin{align*}
            c_{7}'&=\text{Linear-Code-Decoder($c''_7$)}=\\
            \begin{pmatrix} %c'
                1\\
                0\\
                1\\
                1
            \end{pmatrix}
            &=\text{Linear-Code-Decoder(}
            \begin{pmatrix}
                0\\
                1\\
                1\\
                1\\
                1\\
                1\\
                1
            \end{pmatrix}
            \text{)}
            .
        \end{align*}
%    \end{itemize}
    \item Entschlüsselung (Umkehrung des $S_4$-Matrix-Effekts):
%    \begin{itemize}
%        \item[]
        \begin{align*}
            d'_{4}&=S_{4}^{-1} \cdot c'_4 \,(= d_4)\\
            \begin{pmatrix}
                1\\
                1\\
                1\\
                0
            \end{pmatrix}
            &=
            \begin{pmatrix} %s^-1
                0 & 1 & 0 & 1\\
                0 & 1 & 1 & 0\\
                1 & 1 & 0 & 0\\
                0 & 1 & 0 & 0\\
            \end{pmatrix}
            \cdot
            \begin{pmatrix} %c'
                1\\
                0\\
                1\\
                1
            \end{pmatrix}
            .
        \end{align*}
%    \end{itemize}
\end{itemize}

\subsection{7/4-Code
\label{mceliece:subsection:seven_four}}
Beim 7/4-Code handelt es sich um einen linearen Code,
der einen Bitfehler korrigieren kann.
\index{7/4-Code}%
\index{linearer Code}%
\index{Code, linear}%
Es gibt unterschiedliche Varianten zum Erzeugen eines 7/4-Codes,
wobei der hier verwendete Code mithilfe des irreduziblen Generatorpolynoms $P_g = x^3 +x + 1$ generiert wird.
\index{Generatorpolynom}%
Somit lässt sich das Codepolynom $P_c$ berechnen, indem das Datenpolynom $P_d$ mit dem Generatorpolynom $P_g$ multipliziert wird (Codiervorgang):
\[
    P_c=P_g \cdot P_d.
\]
Damit diese Multiplikation mit Matrizen ausgeführt werden kann, werden die Polynome als Vektoren dargestellt (Kapitel \ref{buch:section:polynome:vektoren}):
\[
    P_g = \textcolor{red}{1}\cdot x^0 + \textcolor{blue}{1}\cdot x^1 + \textcolor{darkgreen}{0}\cdot x^2 + \textcolor{orange}{1}\cdot x^3 \implies
    [\textcolor{red}{1}, \textcolor{blue}{1} ,\textcolor{darkgreen}{0}, \textcolor{orange}{1}] = g_4.
\]
Auch das Datenpolynom wird mit einem Vektor dargestellt: $P_d = d_0 \cdot x^0 + d_1 \cdot x^1 + d_2 \cdot x^2 + d_3 \cdot x^3 \implies [d_0, d_1, d_2, d_3] = d_4$.
Der Vektor $g_4$ wird nun in die sogenannte Generatormatrix $G_{7,4}$ gepackt,
sodass die Polynommultiplikation mit $d_4$ mittels Matrixmultiplikation realisiert werden kann:
\[
    c_7=G_{7,4} \cdot d_4=
    \begin{pmatrix}
              \textcolor{red}{1} &                       0  &                       0  &                       0  \\
             \textcolor{blue}{1} &       \textcolor{red}{1} &                       0  &                       0  \\
        \textcolor{darkgreen}{0} &      \textcolor{blue}{1} &       \textcolor{red}{1} &                       0  \\
           \textcolor{orange}{1} & \textcolor{darkgreen}{0} &      \textcolor{blue}{1} &       \textcolor{red}{1} \\
                              0  &    \textcolor{orange}{1} & \textcolor{darkgreen}{0} &      \textcolor{blue}{1} \\
                              0  &                       0  &    \textcolor{orange}{1} & \textcolor{darkgreen}{0} \\
                              0  &                       0  &                       0  &    \textcolor{orange}{1} 
    \end{pmatrix}
    \begin{pmatrix}
        d_0\\        
        d_1\\
        d_2\\
        d_3
    \end{pmatrix}
    =
    \begin{pmatrix}
        c_0\\        
        c_1\\
        c_2\\
        c_3\\
        c_4\\
        c_5\\
        c_6\\
    \end{pmatrix}.
\]
Beim nun entstandenen Codevektor $c_7=[c_0, ..., c_6]$ entsprechen die Koeffizienten dem dazugehörigen Codepolynom $P_c=c_0\cdot x^0+...+c_6\cdot x^6$.
Aufgrund der Multiplikation mit dem Generatorpolynom $P_g$ lässt sich das Codewort auch wieder restlos durch $P_g$ dividieren.
Wird dem Codewort nun einen Bitfehler hinzugefügt, entsteht bei der Division durch $P_g$ einen Rest.
Beim gewählten Polynom beträgt die sogenannte Hamming-Distanz drei, das bedeutet,
\index{Hamming-Distanz}%
dass vom einen gültigen Codewort zu einem anderen gültigen Codewort drei Bitfehler auftreten müssen.
Somit ist es möglich, auf das ursprüngliche Bitmuster zu schliessen, solange maximal ein Bitfehler vorhanden ist.
Jeder der möglichen acht Bitfehler führt bei der Division zu einem anderen Rest,
womit das dazugehörige Bit identifiziert und korrigiert werden kann,
indem beispielsweise die Bitfehler mit dem dazugehörigen Rest in der sogenannten Syndromtabelle (Tabelle \ref{mceliece:tab:syndrome}) hinterlegt werden.
\index{Syndromtabelle}%
\begin{table}
    \begin{center}
        \begin{tabular}{|l|l|}
            \hline
            Syndrom (Divisionsrest)     &korrespondierender Bitfehler\\
            \hline
            1 ($[1,0,0]$)               &$[1,0,0,0,0,0,0]$\\    
            2 ($[0,1,0]$)               &$[0,1,0,0,0,0,0]$\\    
            3 ($[1,1,0]$)               &$[0,0,0,1,0,0,0]$\\    
            4 ($[0,0,1]$)               &$[0,0,1,0,0,0,0]$\\    
            5 ($[1,0,1]$)               &$[0,0,0,0,0,0,1]$\\    
            6 ($[0,1,1]$)               &$[0,0,0,0,1,0,0]$\\    
            7 ($[1,1,1]$)               &$[0,0,0,0,0,1,0]$\\
            \hline

        \end{tabular}
    \end{center}
    \caption{\label{mceliece:tab:syndrome}Syndromtabelle 7/4-Code}
\end{table}
\index{Syndrom}%