-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy path02-symencryption.tex
2175 lines (2026 loc) · 102 KB
/
02-symencryption.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
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
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
\chapter{Symmetrische Verschlüsselung}
\label{cha:symencryption} Ein symmetrisches Verschlüsselungsverfahren
\indexEncryptionSymm sichert eine Kommunikation zwischen (typischerweise
zwei) Parteien durch einen geheimen Schlüssel, den alle Parteien
kennen. Der Schlüssel dient sowohl der Chiffrierung als auch der
Dechiffrierung. Er wird keiner bestimmten Partei, sondern einer
bestimmten Kommunikationsverbindung zugeordnet. Alle klassischen
Verschlüsselungsverfahren sind symmetrisch.
Um eine sichere Kommunikation zu beginnen, müssen sich beide Parteien
zuvor auf einen gemeinsamen Schlüssel einigen. Diesen Vorgang nennen wir
\emph{Schlüsselaustausch}\indexKeyExchange. Bei \emph{offenen} digitalen
Systemen, wie dem Internet, können wir nicht davon ausgehen, dass die
Kommunikationspartner schon vorher in Kontakt standen: Prinzipiell kann
jeder an einem offenen System teilnehmen und hat Zugriff auf die im
System angebotenen Dienste. Daher muss der Schlüsselaustausch innerhalb
des Systems selbst erfolgen. Schlüsselaustauschverfahren betrachten wir
allerdings erst in Kapitel~\ref{cha:keyexchange} und gehen, der
Einfachheit halber, zunächst davon aus, dass beide Kommunikationspartner
bereits über einen gemeinsamen geheimen Schlüssel verfügen.
Eine Verschlüsselungsfunktion erwartet in der Regel eine Eingabe fester
Länge. Daher wird ein Klartext beliebiger Länge vor der Verarbeitung in
eine Folge von Blöcken oder Zeichen fester Länge aufgeteilt, die dann
einzeln chiffriert werden. Wird für jeden Block die
Verschlüsselungsoperation mit dem selben Schlüssel verwendet, so spricht
man von \emph{Blockchiffren}\index{Blockchiffre}. Diese werden in
Kapitel~\ref{sec:blockchiffren} ausführlich behandelt. Als
\emph{sequentielle Chiffren} oder \emph{Stromchiffren}
\index{Stromchiffre} bezeichnet man Verschlüsselungsverfahren, bei denen
die Klartextzeichen nacheinander mit einem in jedem Schritt variierenden
Element eines Schlüsselstroms kombiniert werden.
\section{Stromchiffren} Wir können einen Klartext $\plaint$ als eine
endliche Folge $\plaint = (\plaint_i) =
(\plaint_1,\plaint_2,\dots,\plaint_n) $ von Zeichen $\plaint_i$ aus
einem Klartextalphabet auffassen. Eine Stromchiffre\index{Stromchiffre}
verschlüsselt einen Klartext, indem sie jedes Klartextzeichen
$\plaint_i$ durch ein Chiffratzeichen $\ciphert_i$ aus einem
Chiffratalphabet ersetzt. Üblicherweise handelt es sich bei den
Klartextzeichen um Bits.
Um die Bits, die zur Verschlüsselung mit dem Klartext verknüpft werden,
zu erzeugen, verfügt eine Stromchiffre über einen internen Zustand
$\key^{(i)} \in \{0,1\}^k$, der initial auf den Schlüsselwert $\key$
gesetzt wird und eine \emph{Stream-Cipher-}Funktion
\begin{align*}
SC(\key^{(i)}) \in \{0,1\} \times \{0,1\}^k\, ,
\end{align*}
die den Zustand von $\key^{(i)}$ auf $\key^{(i+1)}$ aktualisiert. Der
Schlüssel $\key$ ist das Geheimnis, dass sich beide Parteien, das heißt,
der Ver- und der Entschlüssler, teilen. Formal ist eine Funktion
$G(\key) \coloneqq (b^{(1)},\dots,b^{(n)})$ definiert, die die Folge der
Verschlüsselungsbits mit Hilfe von $SC$ aus $\key$ extrahiert:
\begin{align*}
&\key^{(0)} \coloneqq \key\\
&\textnormal{Für } i = 0,\dots,n-1\colon (b^{(i+1)},\key^{(i+1)})
\coloneqq SC(\key^{(i)})
\end{align*}
$G$ bezeichnen wir auch als Generator. Für das Chiffrat $\ciphert$ gilt
dann $\ciphert \coloneqq \plaint \circ G(\key)$, wobei $\circ$ eine
binäre Verknüpfung auf Bits ist. Häufig wird hier die logische
XOR-Operation, das heißt, die Addition in $\mathbbm{Z}_{2}$, die wir
nachfolgend durch $\oplus$ ausdrücken, verwendet. Das Chiffratzeichen
$\ciphert_{i}$ ist in diesem Fall durch $\ciphert_{i} \coloneqq
\plaint_{i} \oplus b^{(i)}$ gegeben.
Da Stromchiffren die Chiffratzeichen unabhängig voneinander berechnen,
lassen sich solche Verschlüsselungsverfahren effizient in Hardware
parallelisieren. Zusätzlich trägt die Verwendung einer binären Operation
mit niedriger Komplexität, wie zum Beispiel $\oplus$, zu einer
effizienten Ausführung bei.
\begin{figure}[h]
\centering
\tikzstyle{every circle node}= [draw]
\begin{tikzpicture}
\begin{scope}[>=latex] %for filled arrow tips
% defines
\pgfmathsetmacro\KXCoord{(0.0)} % K X-Koordinate
\pgfmathsetmacro\GYCoord{(-1.5)} % G Y-Koordinate
\pgfmathsetmacro\EncYCoord{(-3.2)} % ENC Y-Koordinate
% draw K_0, SC_Box and connection line
\node (K) at (\KXCoord,0) {$\key$};
\node (G) at (\KXCoord, -1.5) [draw,fill=black!15,rectangle, minimum size=20pt] {$G$};
\draw[->,semithick] (K) -- (G);
% draw XOR operator and conection line SC_Box - XOR
\node (ENC) at (0,\EncYCoord) [draw,fill=black!15,rectangle, minimum size=20pt] {$\circ$};
\draw[->, semithick] (ENC) (G) -- (ENC);
\node (BI) at ({\KXCoord + 0.4}, {\GYCoord - ((\GYCoord - \EncYCoord) * 0.5)}) {$b^{(i)}$};
\node (M) at ({\KXCoord - 2.5}, \EncYCoord) {$\plaint_i$};
\node (C) at ({\KXCoord + 2.5}, \EncYCoord) {$\ciphert_i$};
\draw[->,semithick] (M) -- (ENC);
\draw[->,semithick] (ENC) -- (C);
\end{scope}
\end{tikzpicture}
\caption{Prinzip einer Stromchiffre. Der Klartextstrom
$(\plaint_1,\plaint_2,\dots,\plaint_n)$ wird mit einem, aus dem
Schlüssel $\key$ mit Generator $G$ erzeugten Bitstrom $(b^{(1)},
b^{(2)}, \ldots, b^{(n)})$ durch $\circ$ verknüpft.}
\label{fig:streamcipher}
\end{figure}
Wir bemerken, dass gleiche Klartextzeichen an verschiedenen Positionen
nicht notwendigerweise durch das gleiche Chiffratzeichen codiert werden:
Im Allgemeinen folgt für $i \ne j$ aus $\plaint_i = \plaint_j$ also
nicht $\ciphert_i = \ciphert_j$. Eine derartige Zeichenersetzung heißt
\emph{polyalphabetische Substitution}. An dieser Stelle sei erwähnt,
dass eine Stromchiffre nicht auf dem ursprünglichen Alphabet des
Klartextes arbeiten muss. Sie verwendet jedoch elementare Einheiten
"`kleiner"' Länge, aus denen der Klartext durch Konkatenation aufgebaut
werden kann. Solche Einheiten nennen wir im Folgenden Zeichen.
Das klassische Beispiel einer Stromchiffre ist die in
Abschnitt~\ref{ssec:vigenere} vorgestellte \emph{Vigenère"=Chiffre}. Im
Gegensatz zur Vigenère"=Chiffre bietet eine Stromchiffre, die auf einer
wirklich zufälligen Schlüsselfolge basiert, perfekte Geheimhaltung der
verschlüsselten Nachricht. Dieses Verfahren heißt \emph{One-Time-Pad}
\indexOTP und wird im Abschnitt~\ref{ssec:otp} vorgestellt.
\subsection{Caesar-Chiffre}
Eine der ersten schriftlich belegten Chiffren ist die
\emph{Caesar-Chiffre}\indexCaesar. Der Name stammt vom römischen
Feldherrn Julius Caesar, der nach Aufzeichnungen des römischen
Schriftstellers Sueton seine militärische Korrespondenz verschlüsselte,
indem er jeden Buchstaben des lateinischen Alphabets zyklisch um 3 nach
rechts verschob.
\begin{table}[h]
\centering
\setlength{\tabcolsep}{2pt}
\begin{tabular}{l*{26}{c}}
Klartextalphabet: &A&B&C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V&W&X&Y&Z\\
Geheimtextalphabet: &D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V&W&X&Y&Z&A&B&C\\
\end{tabular}
\caption{Buchstabensubstitution gemäß der Caesar-Chiffre}
\end{table}
Aus dem Klartext \glqq CHIFFRE\grqq{} wird damit beispielsweise das
Chiffrat \glqq FKLIIUH\grqq. Zur Entschlüsselung werden die Buchstaben
im Geheimtextalphabet entsprechend um 3 nach links verschoben. Das
Problem bei dieser Art von Verschlüsselung ist unmittelbar ersichtlich:
Die Methode verändert sich nicht. Daher kann jeder, der einmal erkannt
hat, wie Caesar seine Nachrichten verschlüsselte, diese ohne Probleme
entschlüsseln. Es gibt keinen Schlüssel und die Sicherheit des
Verfahrens hängt allein von der Geheimhaltung der Chiffre ab.
Manchmal wird auch die allgemeine \emph{Verschiebe-Chiffre} als
Caesar-Chiffrierung bezeichnet. Bei dieser Chiffre gibt es einen
Schlüssel $\key$, der die Anzahl der Stellen angibt, um die zyklisch
verschoben wird. Dient das lateinische Alphabet als Grundlage, ist $\key
\in \{0,\dots,25\}$. Einen Klartext $\plaint$ der Länge $n$ betrachten
wir dementsprechend als Zahlenstrom, der sich ergibt, indem jeder
Buchstabe $\plaint_{i}, i \in \{1,\dots,n\}$ aus $\plaint$ auf die Zahl,
die der Stelle des Buchstabens im zugrundeliegenden Alphabet entspricht,
abgebildet wird. Für das lateinische Alphabet ist der resultierende
Zahlenstrom also aus $\{0,\dots,25\}^{n}$.
Die Chiffratzeichen $\ciphert_{i}, i \in \{1,\dots,n\}$ erhalten wir durch
\begin{align*}
\enc(\key, \plaint_i) = \plaint_i + \key \mod 26
\end{align*}
und entschlüsseln gemäß
\begin{align*}
\dec(\key, \ciphert_i) = \ciphert_i - \key \mod 26\, .
\end{align*}
Da allerdings nur 26 mögliche Schlüssel existieren, ist es selbst ohne
Computerunterstützung möglich, jeden Schlüssel auszuprobieren. Ein
solcher Angriff wird als \emph{Exhaustive Search} oder
\emph{Brute-Force-Angriff}\indexBruteForce bezeichnet.
Diese Beobachtung führt zu dem wichtigen Prinzip, dass jedes sichere
Verschlüsselungsverfahren einen Schlüsselraum besitzen muss, der nicht
durch Exhaustive Search angreifbar ist. Im heutigen Zeitalter, in dem
für einen Brute-Force-Angriff\indexBruteForce ein Netz aus mehreren
tausend Computern benutzt werden können, muss der Schlüsselraum groß
sein \cite{NIST_800_57, Blaze1996}. Es ist jedoch wichtig zu verstehen,
dass das obige Prinzip lediglich eine notwendige und keine hinreichende
Bedingung für ein sicheres Verschlüsselungsverfahren darstellt.
Interessanterweise ist eine Variante der Caesar-Verschlüsselung heute
weit verbreitet. Sie wird \emph{ROT-13}\indexCaesarROT genannt und
führt eine zyklische Verschiebung um 13, anstatt um 3 Stellen
durch. Diese Art der Verschlüsselung bietet zwar keine kryptographische
Sicherheit, wird jedoch dazu verwendet, um Spoiler oder Pointen bis zu
einer bewussten Entschlüsselung zu verschleiern. Der Vorteil von ROT-13
besteht darin, dass Ver- und Entschlüsselung exakt die selbe Funktion
verwendet, was für eine einfache Implementierung sorgt.
\subsection{Vigenère-Chiffre}
\label{ssec:vigenere}
Eine Weiterentwicklung der Caesar-Chiffre, die mehr Sicherheit bietet,
ist die sogenannte \emph{Vigenère-Chiffre}\indexVignere, benannt nach
einem Franzosen des sechzehnten Jahrhunderts, Blaise de Vigenère. Im
Gegensatz zur Caesar-Chiffre besteht der Schlüssel $\key =
(\key_{1},\key_{2},\dots,\key_{k}) \in \{0,\dots,25\}^{k}$ nicht
zwangsläufig aus einem Zeichen, sondern einer Zeichenfolge der Länge $k
\geq 1$. Der Zeichenvorrat ist das lateinische Alphabet mit seinen 26
Buchstaben. Die Verknüpfung der Schlüsselfolge mit der Klartextfolge
geschieht durch die zeichenweise Addition modulo~26. Für den Fall, dass
die Schlüssellänge kürzer als die Klartextfolge ist, das heißt $k < n$,
wird das Schlüsselwort periodisch wiederholt.
\begin{align*}
\begin{split}
(\ciphert_{1},\ciphert_{2},\dots,\ciphert_{k},\ciphert_{k+1},\dots) &= (\plaint_{1},\plaint_{2},\dots,\plaint_{k},\plaint_{k+1},\dots)\\
&+ (\key_{1},\key_{2},\dots,\key_{k},\key_{1},\dots) \mod 26
\end{split}
\end{align*}
Für ein Chiffratzeichen $\ciphert_{i}, i \in \{1,\dots,n\}$ heißt das im Allgemeinen:
\begin{align*}
\ciphert_{i} \coloneqq \plaint_{i} + \key_{(i-1 \bmod k)+1} \mod 26
\end{align*}
\begin{table}[h]
\centering
\setlength{\tabcolsep}{2pt}
\begin{tabular}{ll}
Schlüssel:
& SICHER
\end{tabular}
\begin{tabular}{l*{26}{c}}
Klartext:
&A&B&C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V&W&X&Y&Z\\
Schlüsselfolge:
&S&I&C&H&E&R&S&I&C&H&E&R&S&I&C&H&E&R&S&I&C&H&E&R&S&I\\
Geheimtext:
&T&K&F&L&J&X&Z&Q&L&R&P&D&F&W&R&X&V&J&L&C&X&D&B&P&R&I\\
\end{tabular}
\caption{Beispiel einer Vigenère-Chiffre}
\end{table}
\begin{figure}[h]
Für einen Schlüssel der Länge $k$ und einen Klartext der Länge $n$ ist die Chiffrierabbildung der Vigenère-Chiffre gegeben durch:
\begin{align*}
\enc_{\key}\colon (\plaint_1,\ldots,\plaint_{n}) \mapsto
(t_{\key_1}(\plaint_1),\ldots,t_{\key_{k}}(\plaint_{k}),t_{\key_1}(\plaint_{k+1})\ldots,t_{\key_{(n-1
\bmod k)+1}}(\plaint_{n}))\, ,
\end{align*}
wobei $t_{\key_{j}}(\plaint_{i}) \coloneqq \plaint_{i} + \key_{j} \mod
26$, $j = (i-1 \bmod k)+1$.
\end{figure}
Erst das Wiederholen einer im Verhältnis zum Klartext kurzen
Schlüsselfolge ermöglicht die Kryptoanalyse des Vigenère"=Systems. Der
Weg über die Analyse der Häufigkeitsverteilung der Zeichen im
Chiffretext (Aufstellen der Histogramme) führt hier nicht zum Ziel, da
die Histogramme für lange Schlüssel verflachen, d.h. sich einander
angleichen. Daher ist eine Vigenère"=Chiffre wesentlich sicherer als
eine einfache Substitution von Buchstaben; sie wurde sogar bis Mitte des
vorletzten Jahrhunderts für unbrechbar gehalten und als \emph{Le Chiffre
indéchiffrable} bezeichnet.
%TODO: {Citation needed}
Allerdings ist das Brechen der Vigenère-Chiffre relativ einfach, sobald
man die Länge $m$ des Schlüssels kennt, die durch eine einfache
Überlegung bestimmt werden kann: Betrachte für $\tau = 1,2,\ldots$ die
Geheimtextbuchstaben
$t_{\key_j}(\plaint_j),t_{\key_j}(\plaint_{\tau+j}),t_{\key_j}(\plaint_{2
\cdot \tau+j}),\ldots$ und die Gleichung
\begin{equation*}
S_{\tau}= \sum_{i=0}^{25} q^2_i \, ,
\end{equation*}
wobei $q_i$ die Anzahl der Vorkommen des i-ten Buchstaben des Alphabets
in der Sequenz geteilt durch die Summe aller Buchstaben der Sequenz
ist. Sollte für die Schlüssellänge $l = \tau$ gelten, so wäre zu
erwarten, dass $S_{\tau}$ ungefähr den gleichen Wert hat wie unter den
Wahrscheinlichkeiten eines natürlichsprachlichen Textes, da eine
Verschiebe-Chiffre die Häufigkeitsverteilung nicht verschleiert. Der
Wert der Summe entspräche dann annähernd $0.075$. Für $l \neq \tau$ ist
dagegen zu erwarten, dass alle Buchstaben mit ungefähr gleicher
Wahrscheinlichkeit in der Folge $t_{k_j}(m_j),$ $t_{k_j}(m_{\tau+j}),$
$t_{k_j}(m_{2 \cdot \tau+j}),\ldots$ auftreten, also $\forall
i\colon~q_i~\approx~\frac{1}{26}$ und somit
\begin{equation*}
S_{\tau} \approx \sum_{i=0}^{25} (1/26)^2 \approx 0.038 \,\text{.}
\end{equation*}
$S_{\tau}$ unterscheidet sich für $l = \tau$ erkennbar von $l \neq \tau$
und ist der Grund, weshalb diese Methode funktioniert, sofern das
Chiffrat eine hinreichende Länge besitzt. Alternativ kann die Länge der
Schlüsselfolge mit Hilfe der \emph{Kasiski-Friedman-Methode}
\cite{Kasiski1863} ermittelt werden. Eine ausführlichere Erläuterung
findet sich in der Vorlesung \emph{Symmetrische
Verschlüsselungsverfahren}\cite{Geiselmann2016}.
Nun kann das Chiffrat in $l$ unterschiedliche Teilfolgen
($t_{k_j}(m_j),$ $t_{k_j}(m_{l+j}),$ $t_{k_j}(m_{2 \cdot l+j}),\ldots$),
$1 \leq j \leq l$ aufgespalten werden, wobei die Verschlüsselung der
einzelnen Folgen einer Verschiebe-Chiffre entspricht, die leicht mit
Hilfe von Histogrammen gebrochen werden kann.
\subsection{One-Time-Pad}
\label{ssec:otp}
Das \emph{One-Time-Pad}\indexOTP ist eine Stromchiffre mit folgenden Eigenschaften:
\begin{itemize}
\item Der zur Verschlüsselung verwendete Schlüssel $\key$ besitzt die
gleiche Länge $n$ wie der Klartext $\plaint$.
\item Der Schlüssel wird zufällig gleichverteilt aus dem Schlüsselraum
$K \in \{0,1\}^{n}$ ausgewählt. Jeder Schlüssel wird also mit einer
Wahrscheinlichkeit von $\frac{1}{2^{n}}$ gewählt.
\item Zur Verschlüsselung wird der Klartext und der Schlüssel bitweise
mit XOR verknüpft: $\forall i \in \{1,\dots,n\}\colon \ciphert_i =
\plaint_i\oplus\key_i$.
\item Zur Entschlüsselung wird das Chiffrat und der Schlüssel bitweise
mit XOR verknüpft: $\forall i \in \{1,\dots,n\}\colon \plaint_i =
\ciphert_i\oplus\key_i$.
\item Der Schlüssel darf weder vollständig noch teilweise
wiederverwendet werden.
\end{itemize}
Bei Einhaltung aller aufgelisteten Punkte bietet das One-Time-Pad
perfekte Geheimhaltung, da, gegeben ein Chiffrat $\ciphert$, jede
Nachricht $\{0,1\}^{n}$ gleich wahrscheinlich ist und, da Schlüssel
nicht mehrfach verwendet werden, keine Verknüpfung mehrerer Klartexte
berechnet werden kann. Natürlich ist zu beachten, dass ein Angreifer,
der zumindest den Kontext, indem die Nachrichtenübertragung stattfindet,
kennt, sinnvolle von sinnfreien Nachrichten unterscheiden kann.
\begin{beispiel}
\label{ssec:otp:ex:prob}
Alice möchte Bob unter perfekter Geheimhaltung mitteilen, an
welcher Universität sie ihr Studium beginnen möchte. Als
Verschlüsselungsverfahren wählen sie das One-Time-Pad. Die Wahl
von Alice ist auf das \emph{KIT} gefallen. Binär
codiert\footnote{Diese Codierung entspricht dem \emph{8-BIT UCS
Transformation Format}, kurz UTF-8.} entspricht das Akronym
der Bitfolge $01001011\ 01001001\ 01010100$. Alice wählt
zufällig gleichverteilt einen Schlüssel und erhält $K =
00111110\ 01001100\ 10011010$.
\begin{table}[h]
\centering
\setlength{\tabcolsep}{2pt}
\begin{tabular}{l *{8}{>{$}c<{$}} c *{8}{>{$}c<{$}} c *{8}{>{$}c<{$}}}
Klartext:
&0&1&0&0&1&0&1&1&&0&1&0&0&1&0&0&1&&0&1&0&1&0&1&0&0\\
Schlüssel:
&0&0&1&1&1&1&1&0&&0&1&0&0&1&1&0&0&&1&0&0&1&1&0&1&0\\
Geheimtext:
&0&1&1&1&0&1&0&1&&0&0&0&0&0&1&0&1&&1&1&0&0&1&1&1&0\\
\end{tabular}
\end{table}
Ausgehend von dem Chiffrat ist es möglich, einen Schlüssel zu finden,
so dass der korrespondierende Klartext ein Akronym einer anderen
Universität, wie zum Beispiel \emph{MIT}, ist.
\begin{table}[h]
\centering
\setlength{\tabcolsep}{2pt}
\begin{tabular}{l *{8}{>{$}c<{$}} c *{8}{>{$}c<{$}} c *{8}{>{$}c<{$}}}
Geheimtext:
&0&1&1&1&0&1&0&1&&0&0&0&0&0&1&0&1&&1&1&0&0&1&1&1&0\\
Schlüssel:
&0&0&1&1&1&{\color{red} 0}&{\color{red} 0}&0&&0&1&0&0&1&1&0&0&&1&0&0&1&1&0&1&0\\
Klartext:
&0&1&0&0&1&1&0&1&&0&0&0&0&0&1&0&1&&1&1&0&0&1&1&1&0\\
\end{tabular}
\end{table}
Wir sehen, dass in der gleichen Codierung zwei gekippte Schlüsselbits
dem Chiffrat anstelle \emph{KIT} die Buchstaben \emph{MIT} als
Klartext zuordnen. Da der Schlüssel zufällig gleichverteilt gezogen
wird, ist jeder Schlüssel und somit auch jeder Klartext gleich
wahrscheinlich.
\end{beispiel}
Neben dem Vorteil perfekter Geheimhaltung hat das One-Time-Pad auch
einige schwerwiegende Nachteile. Ein elementarer Nachteil besteht darin,
dass die Schlüssellänge der Länge des Klartexts entsprechen muss und so
die zu übermittelnde Datenmenge verdoppelt wird. Dementsprechend schwer
gestaltet sich die Übertragung des Schlüsselmaterials, die, um die
Eigenschaft perfekter Geheimhaltung nicht zu verletzen, physisch
geschehen muss.\footnote{Zur Zeit des Kalten Krieges gab es eine ständig
bestehende telegrafische Verbindung zwischen Washington D.C. und
Moskau -- genannt \emph{Heißer Draht} oder \emph{Rotes Telefon} --,
die mit Hilfe des One-Time-Pads gesichert wurde. Das notwendige
Schlüsselmaterial wurde der Gegenpartei in Code-Büchern übergeben.}
Ein weiteres Argument, dass gegen die Verwendung des One-Time-Pads
spricht ist, dass für jede Nachrichtenübertragung ein neuer Schlüssel
gewählt werden muss, da andernfalls die Eigenschaft der perfekten
Geheimhaltung verloren geht. Das lässt sich formal folgendermaßen
veranschaulichen. Seien $\plaint_{1}, \plaint_{2}$ zwei Klartexte
gleicher Länge, die mit Hilfe des One-Time-Pads und dem Schlüssel $\key$
zur Nachrichtenübertragung verschlüsselt werden. Ein Angreifer, der den
Kanal abhört und in Besitz der Chiffrate $\ciphert_{1} = \plaint_{1}
\oplus \key$ und $\ciphert_{2} = \plaint_{2} \oplus \key$ gelangt,
berechnet
\begin{align*}
\ciphert_{1} \oplus \ciphert_{2} = \plaint_{1} \oplus \key \oplus \key
\oplus \plaint_{2} = \plaint_{1} \oplus \plaint_{2}
\end{align*}
und erhält damit im Allgemeinen nicht-triviale Informationen. Ist
beispielsweise $M_{1} = 00\dots00$ liefert die Verknüpfung der beiden
Geheimtexte den Klartext $M_{2}$.
Ebenso nachteilig ist, dass das One-Time-Pad bei korrekter Verwendung
zwar gegen Angreifer, die die Nachricht lesen möchten, schützt, jedoch
nicht gegen Angreifer, die die Nachricht durch Kippen von Bits des
Geheimtexts verändern. So könnte ein Angreifer gemäß
Beispiel~\ref{ssec:otp:ex:prob} unerkannt zwei Bits des Chiffrats
kippen, so dass Bob beim Entschlüsseln auf einen falschen Klartext
stößt, nämlich MIT. Gezielte sinnhafte Änderungen des zugrundeliegenden
Klartextes sind ohne Schlüsselkenntnis jedoch schwer.
Die obigen Gründe machen die Verwendung des One-Time-Pad unhandlich,
weswegen es nur selten eingesetzt wird. Moderne Stromschiffren
funktionieren prinzipiell wie das One-Time-Pad, benutzen jedoch
Pseudozufallszahlengeneratoren\indexPRNG, die aus einer kurzen Sequenz,
genannt \emph{Seed}\indexSeed, den schlussendlich verwendeten Schlüssel
als Folge von Pseudozufallszahlen erzeugen.
\subsection{Stromchiffren mit Pseudozufallszahlen}
\label{ssec:stromchiffrenpseudozufall}
Wir wissen bereits, dass die Zufallsfolge, die dem One-Time-Pad als
Schlüssel dient, mindestens so lang sein muss, wie die zu
verschlüsselnde Nachricht $\plaint$ und nur ein einziges Mal verwendet
werden darf. Hieraus folgt, dass dieses Verfahren einen extrem hohen
Aufwand für die sichere Schlüsselverteilung erfordert und aus diesem
Grund für die meisten Anwendungen nicht praktikabel ist.
\tikzset{XOR/.style={fill=black!15,draw,minimum size=13pt,circle,append after command={
[shorten >=\pgflinewidth, shorten <=\pgflinewidth,]
(\tikzlastnode.north) edge (\tikzlastnode.south)
(\tikzlastnode.east) edge (\tikzlastnode.west)
}
}
}
\begin{figure}[h]
\centering
\tikzstyle{sc}=[draw,fill=black!15,rectangle,minimum size=20pt,inner sep=0pt]
\tikzstyle{every circle node}= [draw]
\begin{tikzpicture}
\begin{scope}[>=latex] %for filled arrow tips
% defines
\pgfmathsetmacro\KZeroXCoord{(0.0)} % K^(0) X-Koordinate
\pgfmathsetmacro\XorYCoord{(-3.0)} % XOR Y-Koordinate
\pgfmathsetmacro\PYCoord{(-0.75)} % Verbindungspunkt Y-Koordinate
% \pgfmathsetmacro\minBoxHeight{(0.6)} // 0.5 old
% draw K_0, SC_Box and connection line
\node (K0) at (\KZeroXCoord,0) {$\key^{(0)}$};
\node (SC)[sc] at (\KZeroXCoord, -1.5) {$SC$};
\draw[->,semithick] (K0) -- (SC);
\node (p1)[circle, fill, inner sep=0cm, minimum size=0.12cm] at (\KZeroXCoord, \PYCoord) {};
% draw XOR operator and conection line SC_Box - XOR
\node (XOR)[XOR] at (0,\XorYCoord) {};
\draw[->,semithick] ($(SC) + (0.18, -0.36)$) |- (\KZeroXCoord, -2.25) -- (XOR);
\node (BI) at ({\KZeroXCoord + 0.18 + 0.4}, -2.25) {$b^{(i)}$};
% draw connection line from SC to connection point p1
\draw[-,semithick] ($(SC) + (-0.18, -0.36)$) -- (-0.18, -2) -- (-0.5, -2);
\draw[->,semithick] (-0.5, -2) -- (-0.5, {\PYCoord + ((-2 - \PYCoord) * 0.5)});
\draw[-, semithick] (-0.5, {(\PYCoord + ((-2 - \PYCoord) * 0.5)) -0.1}) -- (-0.5, \PYCoord) -- (p1);
\node (KJ) at (-1.0, {\PYCoord + ((-2 - \PYCoord) * 0.5)}) {$\key^{(j)}$};
\node (M) at ({\KZeroXCoord - 2.5}, \XorYCoord) {$\plaint_i$};
\node (C) at ({\KZeroXCoord + 2.5}, \XorYCoord) {$\ciphert_i$};
\draw[->,semithick] (M) -- (XOR);
\draw[->,semithick] (XOR) -- (C);
\end{scope}
\end{tikzpicture}
\caption{Prinzip einer Stromchiffre mit Pseudozufall. Der
Klartextstrom wird zeichenweise mit einem aus dem Seed $\key^{(0)}$
generierten pseudozufälligen Schlüsselstrom verschlüsselt. Die
Entschlüsselung funktioniert analog dazu, das heißt, es wird
dieselbe Seed und Funktion $SC$ verwendet. Beachte auch, dass $SC$
nicht in jedem Iterationsschritt ein Verschlüsselungsbit $b^{(i)}$
erzeugen muss, weshalb die Zählvariablen $i$ und $j$ nicht synchron
sein müssen.}
\label{fig:pseudorandomstreamcipher}
\end{figure}
Es liegt nahe, die genannte Schwierigkeit zu umgehen, indem man nach dem
Vorbild des One-Time-Pad Stromchiffren konstruiert, die statt einer
echten Zufallsfolge sogenannte \emph{Pseudozufallsfolgen}\indexPNS
verwenden. Unter einer Pseudozufallsfolge versteht man eine Folge von
Zeichen, die mittels eines deterministischen Prozesses aus einem relativ
kurzen Initialisierungswert, dem Seed\indexSeed, erzeugt wird und
gewisse Eigenschaften einer echt zufälligen Folge aufweist. Verfügen
beide Kommunikationspartner über identische Generatoren, muss lediglich
der Initialwert und die gewählte Parametrisierung des Generators als
Schlüssel verteilt werden. Die eigentliche Schlüsselfolge kann dann an
beiden Enden des Kanals erzeugt werden.
Eine Voraussetzung der Konstruktion ist offensichtlich, dass der
Pseudozufallsgenerator\indexPRNG effizient berechenbar sein
muss. Außerdem soll auf den Umstand hingewiesen werden, dass es sich bei
der Schlüsselfolge nicht um den Schlüssel des Verfahrens handelt, da die
Folge ein Menge von internen Werten des Algorithmus
ist. Abbildung~\ref{fig:pseudorandomstreamcipher} zeigt den
prinzipiellen Aufbau einer derartigen Stromchiffre.
\subsubsection{Linear Feedback Shift Register}
Eine historisch interessante, aber unsichere Möglichkeit der
Implementierung einer Stromchiffre mit Pseudozufall bieten \emph{Linear
Feedback Shift Register} (LFSR)\indexLFSR. Bei einem LFSR wird der
Schlüssel $\key = (\key_{1},\dots,\key_{k})$ zunächst bitweise in
Speicherzellen $R_{1},\dots,R_{k}$ angeordnet, die in jedem Schritt den
Zustand beschreiben.
\[
\begin{tabular}{lc | *{4}{>{\centering}p{0.8cm}|} c}
\cline{3-6}
Initialzustand $\key^{(0)}$: && $\key_1$ & $\key_2$ & \dots &
$\key_k$
\tabularnewline
\cline{3-6}
\end{tabular}
\]
Für die Aktualisierung eines Zustandes von $\key^{(i)}$ auf
$\key^{(i+1)}$ wird ein Bit
\begin{align*}
\key_{k+i+1} \coloneqq \sum^{k}_{j=1} \alpha_{j} \cdot K_{i+j} \mod 2
\end{align*}
berechnet, wobei $\alpha_{i} \in \{0,1\}, i \in \{1,\dots,k\}$
speicherzellenspezifische Koeffizienten sind. Als Verschlüsselungsbit
$b^{(i+1)}$ wird das in $R_{1}$ gespeicherte Bit $\key_{i+1}$
ausgegeben. Die verbleibenden Bits $\key_{i+2},\dots,\key_{i+k}$ werden
in die jeweils niedriger indexierte Speicherzelle \emph{geschoben}, das
heißt $R_{i} = R_{i+1}$. Schlussendlich wird das neu berechnete Bit in
die höchstindexierte Speicherzelle geschrieben: $R_{k} = \key_{k+i+1}$.
Für den Übergang aus dem Initialzustand $\key^{(0)}$ zu $\key^{(1)}$
ergibt sich beispielhaft folgendes Schema:
\[
\begin{tabular}{lc | *{4}{>{\centering}p{0.8cm}|} c}
\cline{3-6}
$K^{(0)}$: && \(\key_1\) & \(\key_2\) & \dots & \(\key_{k}\) & \\
\cline{3-6}
\multicolumn{1}{c}{} &
\multicolumn{1}{c}{} &
\multicolumn{1}{c}{\(\downarrow\cdot\alpha_1\)} &
\multicolumn{1}{c}{\(\downarrow\cdot\alpha_2\)} &
\multicolumn{1}{c}{\(\ldots\)} &
\multicolumn{1}{c}{\(\downarrow\cdot\alpha_k\)} & \\
\multicolumn{1}{c}{} &
\multicolumn{1}{c}{} &
\multicolumn{5}{c}{\(\xlongrightarrow{\qquad\qquad\qquad\qquad\qquad\qquad}\ \key_{k+1}:=\sum_{j=1}^{k}\alpha_{j}\key_{j} \mod 2\)}
\end{tabular}
\]
\[
\begin{tabular}{lc | *{4}{>{\centering}p{0.8cm}|} c}
\cline{3-6}
$K^{(1)}$: && $\key_{2}$ & \dots & $\key_{k}$ & $\key_{k+1}$ & \\
\cline{3-6}
\multicolumn{1}{c}{} &
\multicolumn{1}{c}{} &
\multicolumn{1}{c}{\hphantom{\(\downarrow\cdot\alpha_1\)}} &
\multicolumn{1}{c}{\hphantom{\(\downarrow\cdot\alpha_2\)}} &
\multicolumn{1}{c}{\hphantom{\(\ldots\)}} &
\multicolumn{1}{c}{\hphantom{\(\downarrow\cdot\alpha_k\)}} & \\
\multicolumn{1}{c}{} &
\multicolumn{1}{c}{} &
\multicolumn{5}{c}{\hphantom{\(\xlongrightarrow{\qquad\qquad\qquad\qquad\qquad\qquad}\ \key_{k+1}:=\sum_{j=1}^{k}\alpha_{j}\key_{j} \mod 2\)}}
\end{tabular}
\]
Wählen wir für die Zustände $\key^{(i)}$ des LFSR die Gestalt $(\key_{1
+ i},\cdots, \key_{k + i})^T$, so lässt sich ein Zustandsübergang wie
folgt darstellen:
\begin{align*}
\key^{(i+1)} = A \cdot \key^{(i)} \text{,} \; \;
A := \begin{pmatrix}
0 & 1 & 0 & \cdots & 0 \\
0 & 0 & 1 & & 0 \\
\vdots & \vdots & & \ddots & \\
0 & 0 & 0 & & 1 \\
\alpha_1 & \alpha_2 & \alpha_3 & \cdots & \alpha_k
\end{pmatrix}
\end{align*}
Daraus ergibt sich für den Schlüsselstrom:
\begin{align*}
b^{(i+1)} & = (1,0,\dots,0) \cdot \key^{(i)} \\
& = (1,0,\dots,0) \cdot (A^i \cdot \key^{(0)}) \\
& = ((1,0,\dots,0) \cdot A^i) \cdot \key^{(0)}
\end{align*}
Die Verschlüsselung eines Klartextes $M$ der Länge $n$ mittels LFSR
lässt sich dementsprechend als Gleichungssystem auffassen:
\begin{align*}
\begin{split}
\forall i \in \{1,\dots,n\} \colon \ciphert_i &= \plaint_i \oplus ((1,0,\dots,0) \cdot A^{i-1}) \cdot \key^{(0)}\\
&= \plaint_i \oplus v_i \cdot \key^{(0)} \, \text{,}
\end{split}
\end{align*}
wobei
\begin{align*}
v_1 &= (1,0,0,\dots,0,0)\\
v_2 &= (0,1,0,\dots,0,0)\\
&\mathrel{\makebox[\widthof{=}]{\vdots}}\\
v_k &= (0,0,0,\dots,0,1)\\
v_{k+1} &= (\alpha_0,\alpha_1,\dots,\alpha_{k-1},\alpha_k)\\
v_{k+2} &= (\alpha_0,\alpha_1,\dots,\alpha_{k-1},\alpha_k) \cdot A^1\\
&\mathrel{\makebox[\widthof{=}]{\vdots}}\\
v_n &= (\alpha_0,\alpha_1,\dots,\alpha_{k-1},\alpha_k) \cdot A^{(n-(k+2)+1)}
\end{align*}
Besitzt der Angreifer ein Klartext-Chiffrat-Paar, welches länger als die
Anzahl $k$ der Speicherzellen ist, kann er den Schlüssel $\key$ direkt
berechnen. Entsprechend ist ein solches Schieberegister alleine
angewendet unsicher. Hilfe bietet eine möglichst strukturzerstörende
Verbindung mehrerer Schieberegister.\footnote{Das Thema wird in der
Vorlesung "`Symmetrische Verschlüsselungsverfahren"' tiefer
behandelt.} Beispielsweise kann man zwei LFSR verwenden, wobei das
zweite LFSR genau dann ausgeführt wird, wenn die Ausgabe des ersten
Schieberegisters $1$ ist.
\section{Blockchiffren}
\label{sec:blockchiffren}
\subsection{Verschlüsselungsverfahren}
%TODO Sicherheitsdiskussion: "Außerdem bieten komplexere Verfahren mehr
%Möglichkeiten für Angreifer, weshalb es auch schwieriger ist, eine
%beweisbare Sicherheit festzustellen. "
Im Gegensatz zu Stromchiffren werden bei Blockchiffren
\index{Blockchiffre} eine feste Anzahl an Bits -- ein Block --
verschlüsselt. Schematisch ergibt sich nahezu dasselbe Bild wie bei
Stromchiffren (siehe Abbildung~\ref{fig:streamcipher}), allerdings
unterscheidet sich die Implementierung fundamental. Einerseits ist die
tatsächliche Verschlüsselungsfunktion in der Praxis nun komplexer als
ein einfaches XOR, da es bei Blöcken mehr Möglichkeiten zur
Strukturänderung gibt. Andererseits benötigen diese Verfahren mehr
Rechenleistung als die Schieberegister und XOR-Netze von Stromchiffren,
wodurch der Datendurchsatz sinkt.
Formal dargestellt ist eine Blockchiffre eine Funktion
\begin{align*}
\enc \colon \{0, 1\}^k \times \{0, 1\}^l \rArrow \{0, 1\}^l\text{,}
\end{align*}
wobei \(k\) die Schlüssellänge und \(l\) die Blocklänge
ist. Blockchiffren stellen also Permutationen der Menge
\(\{0, 1\}^l\) dar.
Bevor wir eine erste Blockchiffre anschauen, müssen wir uns überlegen,
welche Eigenschaften wir fordern, damit eine Blockchiffre als sicher gilt.
Das übergeordnete Design-Kriterium, welchem Blockchiffren unterliegen
sollen, ist die Nichtunterscheidbarkeit\footnote{Damit meinen wir, dass
das Ergebnis der Blockchiffre durch keinen in Polynomialzeit laufenden
Algorithmus von echtem Zufall unterschieden werden kann.} von einer
echt zufälligen Funktion. Präziser gesagt darf sich die Permutation
einer Blockchiffre nicht von einer echt zufälligen Permutation derselben
Menge unterscheiden. Daraus folgt, dass bei einer Blockchiffre kleine
Änderungen in der Eingabe im Mittel zu großen Änderungen in der Ausgabe
führen müssen. Bei einer Blockchiffre, die diese Charakteristik nicht
aufweist, existiert mindestens ein Klartext-Chiffrat-Paar, bei dem ein
Zusammenhang zwischen Klartext und Chiffrat garantiert ist. Wie kann
jedoch eine zu einer echt zufälligen Funktion nichtunterscheidbare
Blockchiffre konstruiert werden?
Hierfür fordern wir zunächst zwei Eigenschaften \cite{Shannon1949}, die
eine Blockchiffre haben sollte: Die erste garantiert, dass jedes Zeichen
des Chiffrats von mehreren Teilen des verwendeten Schlüssels abhängig
ist. Im Englischen wird diese Charakteristik als \emph{confusion}
\indexConfusion bezeichnet. Sie erschwert es einem Angreifer,
Zusammenhänge zwischen einem Schlüssel und eines damit generierten
Chiffrates zu erkennen. Die zweite stellt sicher, dass das Ändern eines
einzelnen Zeichens in der Nachricht bzw. dem Chiffrat zu großen
Änderungen im Chiffrat bzw. der Nachricht führt. Diese Eigenschaft wird
als \emph{diffusion}\indexDiffusion bezeichnet.
Eine Umsetzung dieser Eigenschaften in eine Blockchiffre führt uns zu
dem Konzept der \emph{Feistel networks}\indexFeistel. Die Grundidee
hinter so einem Netzwerk ist, dass wir unsere Blockchiffre \(\enc\) aus
mehreren Rundenfunktionen \(F_1, F_2,\dots, F_n\) zusammenbauen, die
nacheinander ausgeführt werden. Die einzelnen Funktionen müssen dabei
nicht notwendigerweise verschieden sein, wie wir im Abschnitt zu DES
sehen werden. Die Funktion \(F_i\) wird in der $i$-ten Runde des
Algorithmus ausgeführt und ihre Ausgabe dient als Eingabe für die
Funktion \(F_{i+1}\). Die Rundenfunktionen sind dabei so konstruiert,
dass sich Eingabeänderungen exponentiell über die Runden ausbreiten.
\begin{figure}[h]
\centering
\tikzstyle{encrypt}=[draw,fill=black!15,rectangle,minimum size=20pt,inner sep=0pt]
\tikzstyle{every circle node}= [draw]
\begin{tikzpicture}
\begin{scope}[>=latex] %for filled arrow tips
\newcommand{\n}{3}
\draw [decorate,decoration={brace,amplitude=10pt},xshift=0,yshift=0pt] (6.5, {(\n -1)*2 + 2.25}) -- (6.5,-3.25) node [black,midway,xshift=28.0, yshift=0.0] {$\enc$};
\node (rectM) at (2, {(\n -1)*2 + 2}) [draw,thick,minimum width=8cm, minimum height=0.5cm] {$M$};
\node (rect1) at (0, {(\n -1)*2 + 1}) [draw,thick,minimum width=4cm, minimum height=0.5cm] {$L_0$};
\node (rect2) at (4, {(\n -1)*2 + 1}) [draw,thick,minimum width=4cm, minimum height=0.5cm] {$R_0$};
\draw[->,semithick] (rectM) -- (2, {(\n -1)*2 + 1.30});
\foreach \nr in {1, ..., \n}{
\node (x\nr)[XOR] at (0,{(\n-\nr)*2}) {};
\node (F\nr)[encrypt] at (2.0, {(\n-\nr)*2}) {$F_\nr$};
\draw[->,semithick] (F\nr) -- (x\nr);
}
\node (rectL3) at (0, -2.0) [draw,thick,minimum width=4cm, minimum height=0.5cm] {$L_3$};
\node (rectR3) at (4, -2.0) [draw,thick,minimum width=4cm, minimum height=0.5cm] {$R_3$};
% draw first connection lines
\draw[->,semithick] (rect1) -- (x1);
\draw[->, semithick] (rect2) |- (F1);
% \node (p1)[circle, fill, inner sep=0cm, minimum size=0.12cm] at (4, {(\n-1)*2}) {};
% \draw[->, semithick] (p1) -- (F1);
% draw connection lines between F-Boxes
\foreach \nr in {1, ..., 2}{
\pgfmathsetmacro\cnr{int(\nr + 1)}
\node (p\nr)[circle, fill, inner sep=0cm, minimum size=0.12cm] at (4, {(\n-\nr)*2}) {};
\draw[->, semithick] (p\nr) -- (4, {(\n-\nr)*2 - 0.6}) -- (0, {(\n-\nr)*2 - 1.2}) -- (x\cnr);
\draw[->, semithick] (x\nr) -- (0, {(\n-\nr)*2 - 0.6}) -- (4, {(\n-\nr)*2 - 1.2}) |- (F\cnr);
}
\draw[->, semithick] (x3) -- (0, {(\n-3)*2 - 0.6}) -- (4, {(\n-3)*2 - 1.2}) -- (rectR3);
\node (p3)[circle, fill, inner sep=0cm, minimum size=0.12cm] at (4, {(\n-3)*2}) {};
\draw[->, semithick] (p3) -- (4, {(\n-(3))*2 - 0.6}) -- (0, {(\n-(3))*2 - 1.2}) -- (rectL3);
\node (rectC) at (2, -3) [draw,thick,minimum width=8cm, minimum height=0.5cm] {$C$};
\draw[->,semithick] (2, -2.25) -- (rectC);
\end{scope}
\end{tikzpicture}
\caption{3-ründige Feistel-Struktur}
\end{figure}
Eine Rundenfunktion \(F_i\) besteht typischerweise aus Permutationen und
mehreren Funktionen, auf denen die Eingabe aufgeteilt wird. Diese
Funktionen werden als \textit{S(substitution)-Boxen}\indexSBOX
bezeichnet und sind der Grundbaustein der Feistel-Struktur. Die hier
betrachteten S-Boxen realisieren eine Funktion der Form
\begin{align*}
S \colon \{0, 1\}^m \rArrow \{0, 1\}^n
\end{align*}
mit \(m > n\).\footnote{Es gibt auch S-Boxen, für die diese Ungleichung
nicht gilt, beispielsweise die bijektive S-Box von AES.} Dabei werden
alle $m$-Bit langen Wörter (\(2^m\) viele) auf $n$-Bit lange Wörter
(\(2^n\) viele) abgebildet und wir erkennen, dass diese S-Boxen
nicht-invertierbar sind. Je nach Komposition der S-Boxen können
nicht-invertierbare Rundenfunktionen konstruiert werden. Die Eigenschaft
der Nicht-Invertierbarkeit ist signifikant für die Sicherheit von
Feistel-Netzwerken und der sie verwendenden Blockchiffren. Zusätzlich
haben die S-Boxen und die Rundenfunktionen weitere folgende
Eigenschaften:
\begin{enumerate}
\item Wird in der Eingabe einer S-Box ein Bit verändert, so ändern sich
mindestens zwei Bit in der Ausgabe.
\item Die Ausgabe-Bits einer Rundenfunktion $F_i$ werden so permutiert,
dass alle Ausgabe-Bits einer S-Box auf unterschiedliche S-Boxen der
nächsten Runde verteilt werden.
\end{enumerate}
Beide Merkmale stellen die confusion-Eigenschaft der Feistel-Struktur sicher.
%Dennis hatte sich an den "erwartet 4 Bits unterschiedlich" gestört.%
Betrachten wir folgendes Szenario: Gegeben seien zwei $n$-Bit lange
Eingaben $X$ und $X'$, die sich in genau einem Bit unterscheiden. In wie
vielen Bits unterscheiden sich $\enc(X)$ und $\enc(X')$? In der ersten
Runde unterscheiden sich die Eingaben $X_1 = X$ und $X_1' = X'$ in genau
einem Bit, die Ausgaben $X_2 = F_1(X_1)$ und $X_2' = F_1(X_1')$
unterscheiden sich also mindestens in 2 Bits. In der zweiten Runde
unterscheiden sich die beiden Eingaben $X_2$, $X_2'$ in mindestens 2
Bits. Das gewünschte Szenario ist das exponentielle Ausbreiten der
Bit-Unterschiede, so dass in der Ausgabe $F_2(X_2')$ 4
Bit-Positionen\footnote{Da die Ausgabe jeder Runde zusätzlich permutiert
wird, sprechen wir von Bit-Positionen und nicht von Bits.} betroffen
sind. Folglich braucht es mindestens $\lceil \log n \rceil$ Runden,
damit sich eine 1-Bit-Änderung der Eingabe auf alle Bits der Ausgabe
auswirken kann. Führen wir weniger Runden aus, enthält die neue Ausgabe
von der Veränderung unberührte Bits und die Blockchiffre kann von einer
echten Zufallsfunktion unterschieden werden. Es ist zudem zu beachten,
dass die Ausgaben sich dabei nicht in allen betroffenen Bit-Positionen
unterscheiden müssen. Beispielsweise ist durch zweifaches Kippen ein Bit
wieder in seinem Ursprungszustand. Intuitiv ist dieses Verhalten
gewünscht, denn ansonsten könnte die Blockchiffre effizient von einer
echten Zufallsfunktion unterschieden werden.\footnote{Für eine echte
Zufallsfunktion wird erwartet, dass sich bei einer 1-Bit-Änderung der
Eingabe nur die Hälfte der Ausgabe-Bits verändert.}
%TODO: Schlüsselabhängigkeit einfügen?
Das besondere Merkmal einer Feistel-Struktur ist, dass sie invertierbar
ist, selbst wenn ihre Komponenten (Rundenfunktionen, S-Boxen) nicht
invertierbar sind. Dies geschieht dadurch, dass man die Struktur \glqq
rückwärts\grqq~durchläuft, also mit den Funktionen $F_n \dots F_1$.
\subsubsection{Data Encryption Standard (DES)}
\label{sssec:des}
Im Jahr 1973 gab das \emph{National Bureau of Standards} (NBS) der USA,
das heutige \emph{National Institute of Standards and Technology}
(NIST), eine öffentliche Anfrage nach einem Algorithmus zum sicheren
Verschlüsseln sensitiver Regierungsinformationen ab. 1974 entwarf IBM
einen Kandidaten, der auf dem \emph{Lucifer}-Algorithmus basiert und ein
Feistel-Netzwerk verwendet. Das NBS kontaktierte daraufhin die
\emph{National Security Agency} (NSA), um die Sicherheit dieses
Algorithmus zu überprüfen. Nachdem die NSA einige Änderungen
durchgeführt hatte, wurde der überarbeitete Algorithmus 1977 als
\emph{Data Encryption Standard} (DES)\indexDES \cite{NIST_DES99}
standardisiert und für die öffentliche Verwendung freigegeben. Der DES
ist ein symmetrischer Verschlüsselungsalgorithmus, der ein wie oben
beschriebenes Feistel-Netzwerk verwendet, einen 64-Bit langen Schlüssel
benutzt und Daten in je 64-Bit Blöcken verschlüsselt.
Die öffentliche Standardisierung des DES durch eine US-Regierungsbehörde
trug maßgeblich zur schnellen weltweiten Verbreitung des Algorithmus
bei. Gleichzeitig führte die Beteiligung der NSA am Entwurf des DES
dazu, dass seine Sicherheit kontrovers diskutiert wurde. Die
durchgeführten Änderungen der NSA umfassten die Verkürzung des
Schlüssels von ursprünglich 128 Bits auf 56 frei zu wählende Bits, sowie
eine unkommentierte Veränderung der verwendeten S-Boxen. In Anbetracht
der zentralen Bedeutung der S-Boxen für die Sicherheit eines
Feistel-Netzwerkes wurde befürchtet, dass die NSA eine Hintertür in den
DES eingebaut haben könnte. Daraufhin wurden 1994 die Design-Kriterien
für die verwendeten S-Boxen von IBM veröffentlicht
\cite{Coppersmith1994}. Die Veröffentlichung ergab, dass die S-Boxen
besonders resistent gegenüber der erst kurz zuvor (1990)
öffentlich-bekannt gewordenen differentiellen Kryptoanalyse
sind.\footnote{Untersuchungen haben ergeben, dass eine zufällige Wahl
der S-Boxen zu einer deutlich höheren Anfälligkeit gegenüber der
differentiellen Kryptoanalyse geführt hätte. Dies impliziert, dass IBM
und die NSA bereits Jahre vor der Öffentlichkeit über diese
Angriffsmethode Bescheid wussten.}
Betrachten wir nun den Aufbau von DES etwas genauer. Von den insgesamt
64 Bits des Schlüssels können nur 56 Bits frei gewählt werden. Die
verbleibenden 8 Bit sind Paritätsbits und dienen der
Fehlererkennung. Somit umfasst der Schlüsselraum insgesamt (nur)
$2^{56}~\approx~7,2~\cdot~10^{16}$ mögliche Schlüsselkandidaten.
Bevor verschlüsselt werden kann, wird die Nachricht in jeweils 64-Bit
große Blöcke aufgeteilt. Jeder dieser Blöcke wird zunächst einer
Initialpermutation $IP$ unterzogen, die die einzelnen Bits lediglich
umordnet. Die Initialpermutation bietet daher keinerlei kryptographische
Sicherheit, sondern dient der effizienten Nutzung der
Hardware. Anschließend durchlaufen die Nachrichtenblöcke jeweils 16
Verschlüsselungsrunden, wobei jede Runde einen unterschiedlichen 48-Bit
langen Schlüssel verwendet, der sich aus den 56 Bit des Hauptschlüssels
ergibt. Die Rundenfunktion $F$ bleibt hingegen gleich. Auf das Ergebnis
der letzten Runde wird die zu $IP$ inverse Permutation $IP^{-1}$
angewandt.
\newpage
\begin{figure}[h]
\begin{center}
\unitlength=1mm
\linethickness{0.4pt}
\begin{picture}(145,175)
\put(132,168){\makebox(0,0)[cc]{\footnotesize $\key$}}
\put(128,158){\line(2,1){8}}
\put(138,160){\makebox(0,0){\footnotesize 64}}
\put(132,165){\vector(0,-1){9}}
\put(119,148){\framebox(26,8)[cc]{}}
\put(132,154){\makebox(0,0)[cc]{\footnotesize Schlüsselaus-}}
\put(132,150){\makebox(0,0)[cc]{\footnotesize wahlfunktion}}
\put(0,169){\framebox(100,4)[cc]{\footnotesize $\plaint_i$}}
\put(46,164){\line(2,1){8}}
\put(56,165){\makebox(0,0){\footnotesize 64}}
\put(50,169){\vector(0,-1){7}}
\put(0,158){\framebox(100,4)[cc]{\footnotesize $IP$}}
\put(50,158){\vector(0,-1){5}}
\put(51,152){\line(1,0){24}}
\put(25,152){\line(1,0){24}}
\put(50,152){\circle{2}}
\put(21,147){\line(2,1){8}}
\put(31,148){\makebox(0,0){\footnotesize 32}}
\put(25,152){\vector(0,-1){7}}
\put(71,147){\line(2,1){8}}
\put(81,148){\makebox(0,0){\footnotesize 32}}
\put(75,152){\vector(0,-1){7}}
\put(55,140){\framebox(45,5)[cc]{\footnotesize $R^{(0)}$}}
\put(0,140){\framebox(45,5)[cc]{\footnotesize $L^{(0)}$}}
\put(110,140){\makebox(0,0)[cc]{\footnotesize $\key^{(1)}$}}
\put(115,136.5){\line(2,1){8}}
\put(119,135){\makebox(0,0)[cc]{\footnotesize 48}}
\put(125,138.5){\line(0,1){9.5}}
\put(50,138.5){\line(1,0){75}}
\put(50,138.5){\vector(0,-1){1.5}}
\put(75,140){\line(0,-1){10}}
\put(75,135){\vector(-1,0){23}}
\put(50,135){\makebox(0,0)[cc]{\footnotesize $F$}}
\put(50,135){\circle{4}}
\put(48,135){\vector(-1,0){21}}
\put(25,140){\vector(0,-1){3}}
\put(25,133){\line(0,1){4}}
\put(23,135){\line(1,0){4}}
\put(25,135){\circle{4}}
\put(25,133){\line(0,-1){3}}
\put(25,130){\line(0,-1){3.5}}
\put(75,130){\line(0,-1){3.5}}
\put(75,118){\line(-6,1){50}}
\put(25,118){\line(6,1){50}}
\put(25,118){\vector(0,-1){3}}
\put(75,118){\vector(0,-1){3}}
\put(55,110){\framebox(45,5)[cc]{\footnotesize $R^{(1)} = L^{(0)} \oplus F(R^{(0)},\key^{(1)})$}}
\put(0,110){\framebox(45,5)[cc]{\footnotesize $L^{(1)} = R^{(0)}$}}
\put(110,110){\makebox(0,0)[cc]{\footnotesize $\key^{(2)}$}}
\put(115,106.5){\line(2,1){8}}
\put(119,105){\makebox(0,0)[cc]{\footnotesize 48}}
\put(127.5,108.5){\line(0,1){39.5}}
\put(50,108.5){\line(1,0){77.5}}
\put(50,108.5){\vector(0,-1){1.5}}
\put(75,110){\line(0,-1){10}}
\put(75,105){\vector(-1,0){23}}
\put(50,105){\makebox(0,0)[cc]{\footnotesize $F$}}
\put(50,105){\circle{4}}
\put(48,105){\vector(-1,0){21}}
\put(25,110){\vector(0,-1){3}}
\put(25,103){\line(0,1){4}}
\put(23,105){\line(1,0){4}}
\put(25,105){\circle{4}}
\put(25,103){\line(0,-1){3}}
\put(25,100){\line(0,-1){3.5}}
\put(75,100){\line(0,-1){3.5}}
\put(75,88){\line(-6,1){50}}
\put(25,88){\line(6,1){50}}
\put(25,88){\vector(0,-1){3}}
\put(75,88){\vector(0,-1){3}}
\put(55,80){\framebox(45,5)[cc]{\footnotesize $R^{(2)} = L^{(1)} \oplus F(R^{(1)},\key^{(2)})$}}
\put(0,80){\framebox(45,5)[cc]{\footnotesize $L^{(2)} = R^{(1)}$}}
\put(110,80){\makebox(0,0)[cc]{\footnotesize $\key^{(3)}$}}
\put(115,76.5){\line(2,1){8}}
\put(119,75){\makebox(0,0)[cc]{\footnotesize 48}}
\put(130,78.5){\line(0,1){69.5}}
\put(50,78.5){\line(1,0){80}}
\put(50,78.5){\vector(0,-1){1.5}}
\put(75,80){\vector(0,-1){10}}
\put(75,75){\vector(-1,0){23}}
\put(50,75){\makebox(0,0)[cc]{\footnotesize $F$}}
\put(50,75){\circle{4}}
\put(48,75){\vector(-1,0){21}}
\put(25,80){\vector(0,-1){3}}
\put(25,73){\line(0,1){4}}
\put(23,75){\line(1,0){4}}
\put(25,75){\circle{4}}
\put(25,73){\vector(0,-1){3}}
\put(74.5,65){\makebox(0,0){ \Huge $\vdots$}}
\put(50,65){\makebox(0,0){\footnotesize Weitere 12 Runden}}
\put(24.5,65){\makebox(0,0){ \Huge $\vdots$}}
\put(25,60){\line(0,-1){3.5}}
\put(75,60){\line(0,-1){3.5}}
\put(75,48){\line(-6,1){50}}
\put(25,48){\line(6,1){50}}
\put(25,48){\vector(0,-1){3}}
\put(75,48){\vector(0,-1){3}}
\put(55,40){\framebox(45,5)[cc]{\footnotesize $R^{(15)} = L^{(14)} \oplus F(R^{(14)},\key^{(15)})$}}
\put(0,40){\framebox(45,5)[cc]{\footnotesize $L^{(15)} = R^{(14)}$}}
\put(110,40){\makebox(0,0)[cc]{\footnotesize $\key^{(16)}$}}
\put(115,36.5){\line(2,1){8}}
\put(119,35){\makebox(0,0)[cc]{\footnotesize 48}}
\put(140,38.5){\line(0,1){109.5}}
\put(50,38.5){\line(1,0){90}}
\put(50,38.5){\vector(0,-1){1.5}}
\put(75,40){\vector(0,-1){10}}
\put(75,35){\vector(-1,0){23}}
\put(50,35){\makebox(0,0)[cc]{\footnotesize $F$}}
\put(50,35){\circle{4}}
\put(48,35){\vector(-1,0){21}}
\put(25,40){\vector(0,-1){3}}
\put(25,33){\line(0,1){4}}
\put(23,35){\line(1,0){4}}
\put(25,35){\circle{4}}
\put(25,33){\vector(0,-1){3}}
\put(55,25){\framebox(45,5)[cc]{\footnotesize $R^{(16)} = R^{(15)}$}}
\put(0,25){\framebox(45,5)[cc]{\footnotesize $L^{(16)} = L^{(15)} \oplus F(R^{(15)},\key^{(16)})$}}
\put(75,25){\line(0,-1){3}}
\put(25,25){\line(0,-1){3}}
\put(51,22){\line(1,0){24}}
\put(25,22){\line(1,0){24}}
\put(50,22){\circle{2}}
\put(50,21){\vector(0,-1){6}}
\put(0,11){\framebox(100,4)[cc]{\footnotesize $IP^{-1}$}}
\put(46,6){\line(2,1){8}}
\put(56,8){\makebox(0,0){\footnotesize 64}}
\put(50,11){\vector(0,-1){7}}
\put(0,0){\framebox(100,4)[cc]{\footnotesize $\ciphert_i$}}
\end{picture}
\end{center}
\caption{Struktur des DES}
\label{fig:desprinciple}
\end{figure}
DES ist dabei so konstruiert, dass die Ver- und Entschlüsselung, bis auf
die Reihenfolge der verwendeten Teilschlüssel, identisch sind. Um das
Chiffrat zu generieren, werden die Teilschlüssel
$\key^{(1)},\key^{(2)},\dots,\key^{(15)},\key^{(16)}$ konsekutiv
verwendet, während der Entschlüsselungsvorgang die umgedrehte
Reihenfolge $\key^{(16)},\key^{(15)},\dots,\key^{(2)},\key^{(1)}$ der
Teilschlüssel nutzt.
Nachdem wir grob den Ablauf der gesamten Ver- und Entschlüsselung
betrachtet haben, möchten wir nun die einzelnen Runden genauer
beleuchten: Nach Anwenden der Initialpermutation wird der Eingabeblock
in zwei Hälften geteilt. In jeder Runde $i$, $i \in \{1,\ldots,15\}$
berechnen sich die beiden neuen Hälften jeweils wie folgt:
\noindent
\begin{minipage}[h]{.45\textwidth}
\begin{eqnarray*}
L^{(i)} & = & R^{(i-1)} \\
R^{(i)} & = & L^{(i-1)} \oplus F(R^{(i-1)}, \key^{(i)})
\end{eqnarray*}
\end{minipage}\hfill
\begin{minipage}[h]{.45\textwidth}
\begin{eqnarray*}
L^{(16)} & = & L^{(15)} \oplus F(R^{(15)}, \key^{(16)}) \\