IT-Security Teil 7: Restklassen 20.04.17 1
Literatur [7-1] Beutelspacher, A.; Schwenk, J.; Wolfenstetter, K.-D.: Moderne Verfahren der Kryptographie. 4. Auflage, Vieweg 2001 [7-2] Schmeh, Klaus: Kryptografie. dpunkt, 5. Auflage, 2013 [7-3] Hoffmann, Dirk: Einführung in die Informations- und Codierungstheorie. Springer, 2014 [7-4] Reiss, Kristina; Schmieder, Gerald: Basiswissen Zahlentheorie. Springer, 3. Auflage, 2014 [7-5] Buchmann, Johannes: Einführung in die Kryptographie. 5. Auflage, Springer, 2010 [7-6] Freiermuth, Karin; Hromkovic, Juraj; Keller, Lucia; Steffen, Björn: Einführung in die Kryptologie. Vieweg+Teubner, 2010 2
Übersicht Etwas Modulo-Arithmetik Restklassen Der euklidische Algorithmus Der erweiterte euklidische Algorithmus 3
Definitionen und ein Satz I Z Menge der ganzen Zahlen N Menge der ganzen positiven Zahlen mit 0 N\{0} N ohne 0 Satz Für alle Zahlen a Z, b Z\{0} gibt es genau ein q Z und r N mit a = q*b+r, wobei 0 <= r < b ist. r wird Rest genannt und ist immer positiv zwischen 0 und b -1. 4
Definitionen und ein Satz II Ganzzahlige Division: DIV q= a DIV m, wobei a, m, q aus Z, mit m<>0 q ist die größte Ganzzahl < a/m Rest modulo: MOD r= a MOD m, wobei a, m, q aus Z, mit m<>0, r aus N, Konvention (wird meist eingehalten): q (wie Quotient) möge der ganzzahlige Quotient sein r (wie Rest) möge der Modulo-Wert sein p (wie Primzahl) möge eine Primzahl sein m (wie Modul) möge die Zahl hinter mod/mod sein n möge eine natürliche Zahl einschließlich 0 sein 5
Definitionen und ein Satz III Aus Satz (verkürzt) a = b*q+r folgt mit der Definition von DIV und MOD damit: Mit a, m aus Z, mit m<>0, r aus N gilt: a = (a DIV m)*m + a MOD m oder a MOD m = a - (a DIV m)*m Das Modul m kann auch negativ sein: In a MOD m = a - (a DIV m)*m ist das Produkt positiv. Daraus folgt a MOD m = a MOD -m In dieser Veranstaltung (und in der Kryptographie) wird nur mit positiven Modulen gerechnet. 6
Definitionen und ein Satz IV - Beispiele 0 MOD 3 = 0 1 MOD 3 = 1 2 MOD 3 = 2 3 MOD 3 = 0 4 MOD 3 = 1 0 DIV 3 = 0 1 DIV 3 = 0 2 DIV 3 = 0 3 DIV 3 = 1 4 DIV 3 = 1 Es gilt a = (a DIV m)*m + a MOD m a DIV m = (a - a MOD m)/m -1 MOD 3 = 2-2 MOD 3 = 1-3 MOD 3 = 0-4 MOD 3 = 2-5 MOD 3 = 1 22 MOD 7 = 1, denn 3*7=21-22 MOD 7 = 6, denn -4*7= -28 7
Bemerkung In den Programmiersprachen wird häufig nicht die hier angegebene mathematische Definition von MOD benutzt. Es kann sein, dass dort negative Reste berechnet werden. Hier ein Beispiel aus PHP: $a= 10 % 7; 10 mod 7 = 3 $a= -10 % 7-10 mod 7 = -3 $a= 10 % -7; 10 mod -7 = 3 $a= -10 % -7; -10 mod -7 = -3 Das mod-ergebnis wird wie mit +-Vorzeichen berechnet, und das Vorzeichen des Ergebnisses ist bei gleichen Vorzeichen der Operanden +, sonst -. 8
Addition und Subtraktion I Wertebereich: N für das Ergebnis Addition Modulo m: Es wird wie gewöhnlich addiert, wobei anschließend solange m subtrahiert/addiert wird, bis das Ergebnis >= 0 und <m ist. Subtraktion Modulo m: Es wird wie gewöhnlich subtrahiert, wobei anschließend solange m addiert/subtrahiert wird, bis das Ergebnis >= 0 und <m ist. Beispiele: ( 3 + 5) MOD 8 = 0 ( 3 6) MOD 9 = 6 ( 3 6) MOD 9 = 0 9
Teilbarkeit I Definition a Z\{0} teilt b Z, wenn es ein k Z gibt, so das b = k*a Dies wird geschrieben als a b. Oder anders: a teilt b = a b, wenn b MOD a = 0 oder wenn b ein Vielfaches von a ist. 10
Teilbarkeit II Sätze [1] a b a c => a (b+c) [2] a b a c => a (b-c) [3] a b a c => a (k 1 *b+k 2 *c) (Linearkombination) Beweise folgen direkt aus der Definition: [2]: a b a c => a (b-c): Mit b = k 1 *a falls a b und analog c = k 2 *a a (b-c)=> a (k 1 *a-k 2 *a) = a a*(k 1 -k 2 ) analog für die umgekehrte Richtung Analog für [1] und [3] 11
Ein paar Sätze I Definition a MOD m = b MOD m, falls m (a b) mit a, b Z, m N\{0}, dann heißt a zu b kongruent modulo m d.h. mit m (a b) gibt es ein k mit k*m = a b d.h. die Differenz muss ein Vielfaches von m sein d.h. wenn k*m = a b gilt, dann auch a = b + k*m d.h. k*m ist dann in a = b + k*m die Differenz daraus folgt unmittelbar mit k Z: (a+k*m) MOD m = b MOD m (a+k*m) MOD m = a MOD m 12
Ein paar Sätze II Allgemein gilt (a, k aus Z, m N\{0}): [S1] (a + k*m) MOD m = a MOD m (folgt aus Definition) [S2] k*m MOD m = 0 (folgt aus [S1]) [S3] a MOD m = a, falls 0<= a < m Addition (a, b aus Z, m N\{0}): [S4] (a + b) MOD m = (a MOD m + b MOD m) MOD m Subtraktion (a, b aus Z, m N\{0}): [S5] (a - b) MOD m = (a MOD m - b MOD m) MOD m 13
Ein paar Sätze III Beweis für Addition Zu zeigen ist: (a + b) MOD m = (a MOD m + b MOD m) MOD m Es gilt:[a] z = m*(z DIV m) + z MOD m Es gilt:[b] (z + a*m) MOD m = z MOD m, da a*m MOD m = 0 [1] (a + b) MOD m [2] (a + b) MOD m = (m*a DIV m + a MOD m + m*b DIV m + b MOD m) MOD m // da [a] [3] = (m*(a DIV m + b DIV m) + a MOD m + b MOD m) MOD m [4] = (0 + a MOD m + b MOD m) MOD m // da [b] [5] (a + b) MOD m = (a MOD m + b MOD m) MOD m Analog geht dies für die Subtraktion und Multiplikation. 14
Bemerkungen Da a MOD m = b MOD m mit a Z, b N und b<m gilt, kann immer im Bereich: Wertebereich für a: {0, 1, 2,, m-1} bei MOD m gerechnet werden. Wenn ein Ergebnis einer Rechnung außerhalb liegt, kann es jederzeit durch Addieren von k*m in diesen Bereich gebracht werden. Das führt zur Ersparnis bei großen Zahlen. 0 ist das neutrale Element bzgl. der Addition, da a+0 immer a ist. Also (a + 0) MOD m = a MOD m a -1 oder -a wird inverses Element bzgl. der Addition genannt, weil a + (-a) = 0 ist. 15
Multiplikation Multiplizieren wird auf mehrfaches Addieren zurückgeführt. Es wird wie gewöhnlich multipliziert und dann solange m abgezogen bzw. addiert bis das Ergebnis >= 0 und <m ist. Beispiele: 4 * 5 MOD 7 = 6, denn 4*5-> 20-7-7 -> 6 3 * 4 MOD 5 = 2 4 * 4 MOD 5 = 1 Dazu gibt es noch folgende Sätze: [S6] a*b MOD m = b*a MOD m (Kommutativgesetz) [S7] (a*b)*c MOD m = a*(b*c) MOD m (Assoziativgesetz) [S8] a*b MOD m = (a MOD m * b MOD m) MOD m 16
Division Gibt es für ein a ein b mit a*b MOD m = 1? b ist das inverse Element bzgl. * : a -1, also a*a -1 MOD m = 1. Das inverse Element bzgl. * existiert nur dann, wenn a und m teilerfremd sind, also wenn sie außer 1 keinen gemeinsamen Teiler haben also insbesondere, wenn m eine Primzahl ist, dann gibt es für alle Werte ein inverses Element bzgl. der Multiplikation. Beispiel: 5-1 MOD 7 = 3, denn 5 und 7 sind teilerfremd da 5 * 5-1 MOD 7 = 5 * 3 MOD 7 = 1 (mod 7) 6 / 5 MOD 7 6 * 5-1 MOD 7 = 6 * 3 MOD 7 = 4 17
Bestimmung des inversen Elements (Division) I Bei m= 7 wieviel ist 3-1? {0,1,2,3,4,5,6} Rest muss 1 sein: Bei m= 6 wieviel ist 3-1? {0,1,2,3,4,5} Rest muss 1 sein: 3*0= 0 mod 7 = 0 3*1= 3 mod 7 = 3 3*2= 6 mod 7 = 6 3*3= 9 mod 7 = 2 3*4= 12 mod 7 = 5 3*5= 15 mod 7 = 1 3*6= 18 mod 7 = 4 3*0= 0 mod 6 = 0 3*1= 3 mod 6 = 3 3*2= 6 mod 6 = 0 3*3= 9 mod 6 = 3 3*4= 12 mod 6 = 0 3*5= 15 mod 6 = 3 Es gibt kein inverses Element zu 3. 18
Bestimmung des inversen Elements (Division) II Beispiel 1: a=5, m=7 1*5 5 (mod 7) 2*5 3 (mod 7) 3*5 1 (mod 7) 4*5 6 (mod 7) 5*5 4 (mod 7) 6*5 5 (mod 7) Beispiel 2: a=3, m=6, 1*3 3 (mod 6) 2*3 0 (mod 6) 3*3 3 (mod 6) 4*3 0 (mod 6) 5*3 3 (mod 6) Multiplikationstafeln 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 1 0 1 2 3 4 5 6 2 0 2 4 6 1 3 5 3 0 3 6 2 5 1 4 4 0 4 1 5 2 6 3 5 0 5 3 1 6 4 2 6 0 6 5 4 3 2 1 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 1 2 3 4 5 2 0 2 4 0 2 4 3 0 3 0 3 0 3 4 0 4 2 0 2 2 5 0 5 4 3 2 1 19
Restklassen I - Definition Wie oben schon eingeführt: a ist kongruent zu b modulo m, wenn m die Differenz a-b teilt a b (mod m) a b (mod m) bedeutet, dass die Reste bezüglich m gleich sind. 20
Restklassen II - Definition Restklasse von a bzgl. m = Menge von Zahlen aus Z, die sich aus der Addition von a und den Vielfachen von m ergeben. Die Restklasse ist also die Menge aller ganzen Zahlen, die modulo m dieselben Reste ergeben. Es gibt daher m verschiedene Restklassen für die Reste 0..m-1: 0 = {k Z k*m+ 0 } 1 = {k Z k*m+ 1 } m-1 = {k Z k*m+ m-1 } Es wird mit den Stellvertretern gerechnet: {0,1,,m-1}, wobei jedes Element dieser Menge eine Restklasse vertritt. Dies hat für die Realisierung die wichtige Konsequenz, dass der zu realisierende Zahlenbereich in {0,1,,m-1} liegt und nicht größer. 21
Sätze und Regeln für Restklassen Beispiele: 5 5 (mod 5) 2 7 (mod 5) 13 3 (mod 5) 3 13 (mod 5) (1) a + k*m a (mod m) (2) k*m 0 (mod m) Beispiele: 3 + 5 0 (mod 8) 3 6 6 (mod 9) 3 + 6 0 (mod 9) Beispiele: 4 * 5 6 (mod 7) 3 * 4 2 (mod 5) 4 * 4 1 (mod 5) Addition, Subtraktion, Multiplikation (a, b aus Z, m aus N\{0}): (3) a + b a mod m + b mod m (mod m) (4) a - b a mod m - b mod m (mod m) (5) a * b a mod m * b mod m (mod m) Es gelten dieselben Regeln und Sätze wie in der Modulo-Arithmetik. 22
Kleiner Satz von Fermat I Der kleine Satz von Fermat: (1)a p a (mod p), mit a>0 und p ist eine Primzahl Wenn a und p teilerfremd sind (oder: wenn a kein Vielfaches von p ist), kann die folgende zweite Form benutzt werden: (2) a p-1 1 (mod p), mit a>0, ggt(a,p)=1 und p ist eine Primzahl Um von (1) nach (2) zu kommen, muss (1) auf beiden Seiten durch a dividiert werden, was aber nur geht, wenn das multiplikative Inverse existiert; das tut es nur dann, wenn ggt(a,p)=1 ist. (2) bedeutet, dass p-1 auf den Exponenten beliebig oft addiert oder subtrahiert werden kann bzw. der Exponent mod p-1 genommen werden darf. 23
Kleiner Satz von Fermat II a p-1 1 (mod p), mit a>0, a<p und p ist eine Primzahl Falls a=p, dann ist p p-1 mod p = 0 (linke Seite), was nicht 1 ist. ggt(a<p,p) mit p als Primzahl ist immer 1. Beispiele für p=2, für die beiden Formen: a p a(mod p) a p-1 1(mod p) a=1: 1 2 mod 2 = 1 mod 2 a=1: 1 1 mod 2 = 1 mod 2 a=2: 2 2 mod 2 = 2 mod 2 a=2: 2 1 mod 2 1 mod 2, da ggt(2,2)=2 24
Kleiner Satz von Fermat III (1) a p a (mod p), mit a>0 und p ist eine Primzahl a n a (n div p)*p+(n mod p) (mod p), mit a>0 und p ist eine Primzahl a (n div p)*p * a (n mod p) (mod p) (a p ) (n div p) * a (n mod p) (mod p) a (n div p) * a (n mod p) (mod p) (2) a p-1 1 (mod p), mit a>0, ggt(a,p)=1 und p ist eine Primzahl a n a n mod (p-1) (mod p), mit a>0, ggt(a,p)=1 und p ist eine Primzahl Zwei Möglichkeiten die Potenz beim Potenzieren vorher zu reduzieren. Dies ist aber nur dann sinnvoll, wenn n>p gilt. 25
Kleiner Satz von Fermat IV - Anwendung a p-1 a*a p-2 (mod p) Dann gilt laut Fermat aber auch: a*a p-2 1 (mod p), ggt(a,p)=1 und p ist eine Primzahl Das kann zur Berechnung des multiplikativen inversen Elements benutzt werden. 1 1*1*1*1*1= 1 2 2*2*2*2*2= 32 -> 4 Beispiel mod 7 3 3*3*3*3*3= 243 -> 5 4 4*4*4*4*4= 1024 -> 2 5 5*5*5*5*5= 3125 -> 3 6 6*6*6*6*6= 7776 -> 6 Für a=7, 14 etc. kommt immer 0 heraus. 26
Logarithmus, Wurzel Diskreter Logarithmus (Modulo Logarithmus) a x b (mod q) Die Berechnung des diskreten Logarithmus ist sehr aufwändig, weshalb dies in der Kryptographie gerne ausgenutzt wird. Modulo Wurzel x a b (mod q) 27
Größter gemeinsamer Teiler (ggt) I Eine Zahl c heißt größter gemeinsamer Teiler (ggt) zweier Ganzzahlen a und b, wenn c beide Zahlen teilt und die größte ist, die beide Zahlen teilt. Ein paar hoffentlich einleuchtende Sätze zum ggt: ggt(a,a) = ggt(a,0)= a ggt(a,b) = ggt(b,a) ggt(a,k*a) = a, mit k aus N Die Idee besteht nun darin, die beiden Argumente schrittweise unter Beibehaltung des Ergebnisse so zu verkleinern, dass anhand einer der beiden roten Formeln das Ergebnis bestimmt ist. 28
Größter gemeinsamer Teiler (ggt) II Satz: Für alle Zahlen a, b, k aus N mit a>b gilt: Wenn k beide Zahlen a und b teilt, dann teilt auch k die Differenz a-b. Beweis (hatten wir oben schon) Daraus lässt sich beweisen: ggt(a,b) = ggt(a-b,b) mit a>=b Oder anders formuliert: Ziehe immer wieder die kleinere von der größeren der beiden Zahlen ab bis sie gleich sind: das ist das Ergebnis. 29
Größter gemeinsamer Teiler (ggt) III int Euklid(int a,b) { while b>0 { if b<a { exchange(a,b); } b:= b-a; } return a; } Diese Version entspricht eher dem Original: wechselseitiges "Wegnehmen" ggt(a,b) = ggt(a,b-a) ggt(a,b) = ggt(b,a) int Euklid(int a,b) { while a!=b { if a>b { a:= a-b; } else { b:= b-a; } } return a; } 30
Größter gemeinsamer Teiler (ggt) IV Der bisherige Algorithmus ist nur dann effizient, wenn a und b relativ gleich groß sind - aber es geht noch besser... a = (a DIV q)*q + a MOD q ggt(a,b) = ggt((a DIV b-0)*b + a MOD b,b) = ggt((a DIV b-1)*b + a MOD b,b) da a:= a-b erlaubt ist = ggt((a DIV b-2)*b + a MOD b,b)... = ggt((2 )*b + a MOD b,b) = ggt((1 )*b + a MOD b,b) = ggt((0 )*b + a MOD b,b) ggt(a,b) = ggt(a MOD b,b) mit a>=b Der entscheidende Schritt ist der markierte: der 1. Parameter von ggt(a,b), also das a, wird mit Hilfe des Moduls b umgerechnet, falls b<>0. 31
Bemerkungen Warum kommt in der Kette der Subtraktionen am Ende 2,1,0 heraus? Weil a DIV b in jedem Schritt um 1 herunter gezählt wird; das wiederum hat den Grund, dass in jedem Schritt b subtrahiert wird. Das mehrfache Subtrahieren des b-wertes von a solange b>a ist, ist gerade das Verfahren zur Berechnung des Restes bzgl. b. 32
Größter gemeinsamer Teiler (ggt) V int EuklidMod(int a,b) { while a!=0 { if a>b { a:= a MOD b; } else { exchange(a,b); } } return b; } ggt(a,b) = ggt(a,b mod a) ggt(a,b) = ggt(b,a) int EuklidMod(int a,b) { while b!=0 { t:= a MOD b; a:= b; b:= t; } return a; } Da nach einem a:= a MOD b nie a>b wahr ist, kann gleich getauscht werden. 33
Erweiterter Euklidischer Algorithmus I Seien a, b N\{0} so lässt sich der ggt(a,b) als Linearkombination von a und b darstellen: ggt(a,b)= u*a+v*b mit u,v Z. Beispiel mit a=2 und b=7 0 = 7*2 2*7 1 = -3*2 + 1*7 2 = 8*2-2*7 3 = -9*2 + 3*7 4 = -5*2 + 2*7 5 = Dazu gibt es folgenden Satz u*a+v*b=n ist genau dann ganzzahlig lösbar, wenn ggt(a,b) n gilt. Nebenbei: Wenn ggt(a,b)<>1 ist, dann lassen sich nicht alle Zahlen als Linearkombination darstellen. 34
Erweiterter Euklidischer Algorithmus II Linearkombination einer Zahl z ist die Summe zweier Produkte, deren Teilfaktoren vorgegeben sind: z = u*a + v*b, wobei a und b vorgeben sind. Es kann mehrere Linearkombinationen derselben Zahl geben (nicht eindeutig), z.b. 0 = 7*2 2*7 = 14*2 4*7 mit a=2 und b=7 Und auch gibt es Paare a,b, mit denen nicht alle ganzen Zahlen als Linearkombinationen darstellen kann, z.b. lassen sich keine ungeraden Zahlen als Summe zweier gerader Zahlen darstellen. 35
Berechnung des multiplikativen Inversen a*a -1 1 (mod m) mit ggt(a,m)=1 das sind die Voraussetzungen ggt(a,b)= u*a+v*b also ggt(a,m)= u*a+v*m 1 (mod m) 0 a -1 a 36
Erweiterter Euklid scher Algorithmus mit Subtraktion func BigInt BigInt BigInt egcd(bigint a>=0,b>=0) { BigInt au,av,bu,bv; BigInt a,b,t; au:= 1; av:= 0; // a = au*a + av*b } bu:= 0; bv:= 1; while a!= b { if a>b { a:= a-b; au:= au-bu; av:= av-bv; } else { b:= b-a; bu:= bu-au; bv:= bv-av; } } return a,au,av; // b = bu*a + bv*b // linear // linear Grün sind die Bestandteile des ursprünglichen Algorithmus. Bitte beachten Sie, dass die u- und v-werte negativ sein können, dann muss dies durch Addition des Moduls korrigiert werden. 37
Erweiterter Euklid scher Algorithmus mit mod func BigInt BigInt BigInt egcdmod(bigint a>=0,b>=0) { BigInt au,av,bu,bv; BigInt a,b,t; au:= 1; av:= 0; // a = au*a + av*b bu:= 0; bv:= 1; // b = bu*a + bv*b while b!= 0 { q:= a div b; t:= a mod b; bu:= au-q*bu; // linear: b:= a mod b bv:= av-q*bv; a:= b; b:= t; Grün sind die Bestandteile des ursprünglichen Algorithmus. } return a,au,av; } Bitte beachten Sie, dass die u- bzw. v-werte negativ sein können, dann muss dies durch Addition des Moduls korrigiert werden. 38
Nach dieser Anstrengung etwas Entspannung... 39