03.08.2013 Aufrufe

Sicherheit in Rechnernetzen: - Professur Datenschutz und ...

Sicherheit in Rechnernetzen: - Professur Datenschutz und ...

Sicherheit in Rechnernetzen: - Professur Datenschutz und ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!