Sicherheit in Rechnernetzen: - Professur Datenschutz und ...
Sicherheit in Rechnernetzen: - Professur Datenschutz und ...
Sicherheit in Rechnernetzen: - Professur Datenschutz und ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
60<br />
A. Pfitzmann: Datensicherheit <strong>und</strong> Kryptographie; TU Dresden, WS2000/2001, 15.10.2000, 15:52 Uhr<br />
59<br />
A. Pfitzmann: Datensicherheit <strong>und</strong> Kryptographie; TU Dresden, WS2000/2001, 15.10.2000, 15:52 Uhr<br />
7 (1011) 2 := (–1) 2 •7 ≡ 7;<br />
7 (10110) 2 := 7 2 ≡ 5.<br />
a ≡ b mod n :⇔ n | (a –b).<br />
(Das Zeichen „|“ steht für „ist e<strong>in</strong> Teiler von“, d.h. x|y :⇔ ∃ z ∈ZZ: y = xz) Es gilt a ≡ b mod n<br />
genau dann, wenn sie bei Division durch n denselben Rest lassen.<br />
Nun def<strong>in</strong>iert man zu jedem a ∈ZZ e<strong>in</strong>e Restklasse a _ := {b ∈ ZZ | a ≡ b mod n}. Mit diesen<br />
Klassen kann man rechnen, weil gilt<br />
• ZZ *<br />
n bezeichnet die multiplikative Gruppe von ZZn, d.h. die Menge aller Elemente, die e<strong>in</strong> Inverses<br />
haben. (Man kann leicht zeigen, daß das wirklich e<strong>in</strong>e Gruppe ist.) Es gilt<br />
ZZ *<br />
n = {a ∈ ZZn | ggT(a, n) = 1}.<br />
Auch das Berechnen der Inversen ist „leicht“. Man verwendet den sog. erweiterten Euklidschen<br />
Algorithmus. Dieser berechnet allgeme<strong>in</strong> zu a, b ∈ ZZ den ggT <strong>und</strong> zwei ganze Zahlen u, v mit<br />
u a + v b = ggT(a, b)<br />
Das sei nur an e<strong>in</strong>em Beispiel dargestellt: a = 11, b = 47. Dazu wenden wir zunächst den<br />
normalen Euklidschen Algorithmus an, bei dem iterativ der vorige Divisor durch den vorigen Rest<br />
geteilt wird:<br />
47 = 4 •11 + 3;<br />
11 = 3 • 3 + 2;<br />
3 = 1 • 2 + 1.<br />
Nun beg<strong>in</strong>nt man mit der letzten Zeile, den ggT als L<strong>in</strong>earkomb<strong>in</strong>ation des Divisors <strong>und</strong><br />
Dividenden der jeweiligen Zeile darzustellen:<br />
1 = 3 – 1•2 (Jetzt 2 durch 3 <strong>und</strong> 11 ersetzen)<br />
= 3 – 1•(11–3•3) = –11 + 4•3 (Jetzt 3 durch 11 <strong>und</strong> 47 ersetzen)<br />
= –11 + 4•(47–4•11) = 4•47 – 17•11. (Probe: 4•47= 188, 17•11=187)<br />
a1 ≡ a2 mod n ∧ b1 ≡ b2 mod n ⇒ a1 ±b1 ≡ a2 ±b2 mod n ∧ a1•b1 ≡ a2•b2 mod n,<br />
wie man recht leicht nachrechnet. (D.h. um zwei Klassen a _ , b _ zu addieren o.ä., kann man zwei<br />
beliebige Elemente daraus nehmen <strong>und</strong> erhält immer dasselbe Ergebnis.) Konkret nimmt man i.<br />
allg. die Vertreter aus {0,…,n–1} <strong>und</strong> bildet vom Ergebnis den Rest bei Division durch n,<br />
<strong>in</strong>sbesondere ist das die üblichste Darstellung im Rechner. Zum „Rechnen von Hand“ nimmt man<br />
häufig die symmetrische Repräsentation um die Null herum, für ungerade Zahlen n also<br />
{–(n–1)/2, ..., 0, ..., (n–1)/2} <strong>und</strong> für gerade Zahlen n etwas weniger symmetrisch {–n/2+1, ...,<br />
0, ..., n/2}.<br />
Die meisten üblichen Rechenregeln gelten, genauer ist ZZ n e<strong>in</strong> kommutativer R<strong>in</strong>g mit 1.<br />
(Dies kann man, v.a. bezüglich Speicherplatz, noch optimieren, s. Literatur.)<br />
Speziell zum Invertieren von a berechnen wir mit dem erweiterten Euklidschen Algorithmus ganze<br />
Zahlen u, v mit<br />
u a + v n = 1.<br />
Dann gilt offenbar<br />
u a ≡ 1 mod n,<br />
<strong>und</strong> das heißt gerade, daß u das Inverse von a ist. In unserem Beispiel haben wir also<br />
11 –1 ≡ –17 ≡ 30 mod 47<br />
erhalten (<strong>und</strong> auch 47 –1 ≡ 4 mod 11 sowie 11 –1 ≡ –17 ≡ 3 mod 4 <strong>und</strong> 47 –1 ≡ 4 mod 17.) 48<br />
• Addition, Subtraktion <strong>und</strong> Multiplikation <strong>in</strong> ZZ n s<strong>in</strong>d „leicht“. Man kann mit den Langzahlen aus<br />
mehreren Rechnerwörtern im Pr<strong>in</strong>zip rechnen wie mit Dezimalzahlen aus mehreren Ziffern <strong>in</strong> der<br />
Schule. (Ist l die Länge von n, so ist der Aufwand von plus <strong>und</strong> m<strong>in</strong>us O(l), der von mal O(l2 ) –<br />
egal ob <strong>in</strong>nerhalb der ganzen Zahlen oder mod n gerechnet wird [Lips_81 Seite 202]. Es gibt auch<br />
schnellere Algorithmen, aber für Zahlen der <strong>in</strong> der Kryptographie üblichen Größenordnungen s<strong>in</strong>d<br />
die Unterschiede noch nicht groß.)<br />
Auch die Exponentiation ab mod n mit e<strong>in</strong>em Exponenten b derselben Größenordnung ist<br />
„leicht“. 47 Sie wird oft gebraucht (z.B. schon oben im Primzahltest). Allerd<strong>in</strong>gs würde hier<br />
e<strong>in</strong>faches b-maliges Multiplizieren zu lange dauern. Man verwendet sog. „square-and-multiply“-<br />
Algorithmen, bei denen der Exponent b<strong>in</strong>ärstellenweise abgearbeitet wird; sei b = (bl-1 … b0) 2 die<br />
B<strong>in</strong>ärdarstellung. Hier wird die Berechnung von l<strong>in</strong>ks skizziert (man kann auch von rechts<br />
anfangen):<br />
Es wird der Reihe nach a (bl–1 ) 2 (b<br />
, a l–1bl–2 ) 2 (b<br />
usw. berechnet. Dabei erhält man aus a l–1bl–2 …<br />
bl–i ) 2 den nächsten Wert, je nach dem nächsten Exponentenbit, als<br />
a (b l–1 b l–2 … b l–i 0) 2 = a 2•(b l–1 b l–2 … b l–i ) 2 = (a (b l–1 b l–2 … b l–i ) 2) 2<br />
3.4.1.2 Elementanzahl von ZZ n * <strong>und</strong> Zusammenhang mit Exponentiation<br />
Hier s<strong>in</strong>d erste Eigenschaften von ZZ n, bei denen Kenntnis des Geheimnisses (p, q) hilft:<br />
• Die Eulersche φ-Funktion ist def<strong>in</strong>iert als<br />
φ(n) := |{a ∈ {0,…,n–1} | ggT(a, n) = 1}|,<br />
wobei für beliebige ganze Zahlen n ≠ 0 gilt: ggT(0,n) = |n|, vgl. z.B. [Lüne_87 Seite 12].<br />
Es folgt sofort aus den beiden Def<strong>in</strong>itionen, daß<br />
| ZZ *<br />
n | = φ(n).<br />
Speziell für n = p•q mit p, q prim <strong>und</strong> p≠q kann man φ(n) leicht ausrechnen:<br />
bzw. a (bl–1bl–2 … bl–i1) 2 2•(b<br />
= a l–1bl–2 … bl–i ) 2 +1 (b<br />
= (a l–1bl–2 … bl–i ) 2) 2<br />
• a.<br />
Es wird also pro B<strong>in</strong>ärstelle quadriert (square) <strong>und</strong> bei e<strong>in</strong>er 1 noch zusätzlich multipliziert<br />
(multiply) – jeweils mod n.<br />
Also ist der Aufwand für e<strong>in</strong>e Exponentiation ab mod n mit e<strong>in</strong>em Exponenten b derselben<br />
Größenordnung höchstens O(l3 ), denn Quadrieren (<strong>und</strong> ggf. auch Multiplizieren) wird l mal<br />
durchlaufen. Ist der Exponent b kürzer – führende Nullen streichen wir weg –, so braucht für<br />
jedes Bit, das er kürzer ist, e<strong>in</strong>mal weniger quadriert (<strong>und</strong> ggf. multipliziert) zu werden. Ist |b| die<br />
Länge des Exponenten b, so ist der Aufwand zur Berechnung von ab mod n folglich höchstens<br />
O(l2•|b|). Beispiel: 722 mod 11. 22 ist b<strong>in</strong>är (10110) 2 . Also berechnen wir<br />
7 (1) 2 := 7;<br />
7 (10) 2 := 7 2 ≡ 5;<br />
7 (101) 2 := 5 2 •7 ≡ 3•7 ≡ –1;<br />
48 Damit sieht man auch, daß die obige Gleichung Zn<br />
*<br />
= {a ∈ Zn | ggT(a, n) = 1} stimmt: Gerade haben wir für jedes<br />
a mit ggT(a, n) = 1 tatsächlich e<strong>in</strong> Inverses bestimmt. Umgekehrt: Wenn es e<strong>in</strong> Inverses gibt, also a•a –1 ≡ 1 mod<br />
n, gilt n | (a•a –1 –1), also gibt es v mit a•a –1 –1 = v•n bzw. a•a –1 –v•n = 1. Hätten a <strong>und</strong> n e<strong>in</strong>en geme<strong>in</strong>samen<br />
Teiler d, so würde dieser also auch 1 teilen.<br />
47 Als Anhaltspunkt: Praktisch dauert e<strong>in</strong>e solche Exponentiation, wenn alle drei Parameter 512 bit lang s<strong>in</strong>d, <strong>in</strong><br />
Software auf 1997 verfügbaren PCs größenordnungsmäßig 0,1 Sek<strong>und</strong>e. Es hängt natürlich von der genauen<br />
Rechnerleistung <strong>und</strong> der Qualität der Implementierung ab.