Kryptologie Bernd Borchert Univ. Tübingen WS 15/16 Vorlesung Teil 1b Rechnen modulo n Modulo Rechnen a mod n ist definiert als Rest von a bei Division durch n (a aus Z, n aus N) a + b mod n = a mod n + b mod n mod n a - b mod n = a mod n - b mod n mod n a * b mod n = a mod n * b mod n mod n Mit anderen Worten: bei +, - und * kann man diese Operationen und mod in einer Rechnung jederzeit vertauschen. Beispiele: 6 + 9 = 4 mod 11 6 – 9 = - 3 mod 11 = 8 mod 11 6 * 9 = 10 mod 11 10 0 9 8 7 Was ist mit Dividieren und Potenzieren? 2 mod 11 3 6 5 Zn sei die Menge der Zahlen 0,1,...,n-1. Die Operationen +, - und * auf Z n sind eindeutig definiert und einfach zu berechnen. 1 4 Modulo Division Was soll mit a geteilt durch b mod n gemeint sein? Wir definieren: “a geteilt durch b mod n” bedeutet die Multiplikation von a mit dem multiplikativen Inversen von b mod n. Und was ist das multiplikative Inverse von b mod n? (Wir sagen ab jetzt: das multiplikative Inverse von b in Zn ) b-1 in Zn ist die Zahl c so dass b*c = 1 mod n. Wenn b-1 mod n existiert ist es eindeutig. Beispiel: Das mult. Inverse von 2 in Z5 ist 3, denn 2*3 = 6 = 1 mod 5. Nicht jede Zahl a hat ein mult. Inverses in Zn , z. B. hat 2 in Z4 kein Inverses (2*1 = 2 mod 4, 2*2 = 0 mod 4, 2*3 = 2 mod 4). Später sehen wir: Wenn p Primzahl ist, hat jede Zahl in Z p ein mult. Inverses, d.h. Zp ist ein sogenannter Körper. Aber vorerst stellen wir nur das Verfahren zur Berechnung des mult. Inversen von b in Zn vor – das Verfahren wird uns dabei automatisch sagen, ob dieses Inverse existiert. Euklischer Algorithmus (für ggT) Gesucht: größter gemeinsamer Teiler ggT(a,b) von zwei Zahlen a und b (hier jetzt keine modulo Rechnung, sondern Rechnung in Z) ggT(61,36) = 1 61:36 = 1 x 36 + 25 36:25 = 1 x 25 + 11 25:11 = 2 x 11 + 3 11: 3 = 3 x 3 + 2 3:2 = 1 x 2 + 1 2: 1 = 2 x 1 + 0 ggT(61,36) = 1 Euklid, Alexandria (Ägypten), ca. 300 v.Chr. Beweis Euklischer Algorithmus Beweis (anschaulich, wie im Original von Euklid ca. 300 v.Chr.) ggT(a,b) = ggT(b,c) wobei c der Rest ist von a : b a b Ein Teiler t von a und b muss auch den Rest c teilen: a b a b t t t t t c b t t t Wenn c nicht durch t teilbar ist, wäre es a auch nicht t t t Das gilt auch für den größten Teiler, also ggT(a,b) = ggT(b,c) Gesamtbeweis von Euklid's Algorithmus: ggT(a,b) = ggT(b,c) = ggT (c,d) = ... = ggT(an,bn) Euklischer Algorithmus (für ggT) Gleiche Berechnung ,aber hier nochmal in Tabellenform: gesucht: ggT(61,36) ggT(61,36) = 1 61:36 = 1 x 36 + 25 36:25 = 1 x 25 + 11 25:11 = 2 x 11 + 3 11: 3 = 3 x 3 + 2 3:2 = 1 x 2 + 1 2: 1 = 2 x 1 + 0 ggT(61,36) = 1 a b q r 61 36 1 25 36 25 1 11 25 11 2 3 11 3 3 2 3 2 1 1 2 1 2 0 1 0 Erweiterter Euklischer Algorithmus Gegeben sind a und b. 13 x 61 + -22 x 36 = 1 Gesucht sind s und t so dass sa + tb = ggT(a,b) (Prüfung: 793 – 792 = 1) a b q r s t 61 36 1 25 13 -22 = -9 – 1 x 13 36 25 1 11 -9 13 = 4 – 1 x -9 25 11 2 3 4 -9 = -1 – 2 x 4 25:11 = 2 x 11 + 3 11 3 3 2 -1 4 = 1 – 3 x -1 11: 3 = 3 x 3 + 2 3 2 1 1 1 -1 =0–1x1 2 1 2 0 0 1 1 0 1 0 61:36 = 1 x 36 + 25 36:25 = 1 x 25 + 11 3:2 = 1 x 2 + 1 2: 1 = 2 x 1 + 0 ggT(61,36) = 1 s := tu t := su - q x tu Erweiterter Euklischer Algorithmus - Beweis Korrektheit Gegeben sind a und b. 13 x 61 + -22 x 36 = 1 Gesucht sind s und t so dass sa + tb = ggT(a,b) 61:36 = 1 x 36 + 25 36:25 = 1 x 25 + 11 25:11 = 2 x 11 + 3 11: 3 = 3 x 3 + 2 3:2 = 1 x 2 + 1 (Prüfung: 793 – 792 = 1) a b q r s t 61 36 1 25 13 -22 = -9 – 1 x 13 36 25 1 11 -9 13 = 4 – 1 x -9 25 11 2 3 4 -9 = -1 – 2 x 4 11 3 3 2 -1 4 = 1 – 3 x -1 3 2 1 1 1 -1 =0–1x1 2 1 2 0 0 1 1 0 1 0 2: 1 = 2 x 1 + 0 ggT(61,36) = 1 s := tu t := su - q x tu Korrektheitsbeweis. Zu zeigen ist die Invariante sa + tb = ggT(a,b) für jede Zeile. Induktions-Anfang: zweitunterste Zeile. Induktionsschluss: sa + tb = tua + (su - qtu )b = tu(auq + bu) + (su - q tu )au = tuauq + tubu + suau- q tu au = tubu + suau = ggT(a,b) Berechnung Multiplikatives Inverses modulo a Gegeben ist a,b. Gesucht ist das Multiplikative Inverse i von b modulo a, d.h. b x i = 1 mod a Beispiel mod 29: Gegeben 20, für welches i ist 20 x i = 1 mod 29? Methode = Erw. Euklid. Alg. 9 x 29 + -13 x 20 = 1 a b q r s t 29 20 1 9 9 -13 20 9 2 2 -4 9 9 2 4 1 1 -4 2 1 2 0 0 1 1 0 1 0 ggT(29,20) = 1 Wenn ggT(a,b) nicht = 1, dann gibt es das Mult. Inverse nicht! (Prüfung: 261 – 260 = 1) also -13 x 20 = 1 mod 29 d.h., modulo 29 ist -13 = 16 das Mult. Inverse von 20 (Prüfung: 16 x 20 = 320 = 11 x 29 + 1) Inverses steht rechts oben in der Tabelle Also -13 = 16 mod 29 Potenzieren Dividieren in Zn geht also auch. Die Berechnung ist gewöhnungsbedürftig, aber für einen Computer aber kein Problem, auch nicht von der Rechenzeit her. Was ist mit Potenzieren? 4383 mod n ist ein Zahl < n. Kann man das berechnen, ohne 83 mal zu multiplizieren? Beobachtung: 432 braucht 1 Multiplikation c d 4 2 2 Potenzgesetz: (a ) = ac*d 43 = (43 ) braucht 2 Multiplikationen, 438 = (434)2 braucht nur 3 Multiplikationen, etc. z.B. 4364 = (432)2)2 )2)2)2 braucht nur 6 Multiplikationen mod n Daraus ergibt sich der folgende Algorithmus. Um ab mod n zu berechnen, berechne a2 k mod n, a4 mod n, a8 mod n, …, bis zum ersten a2 mod n, so dass 2k+1 größer ist als b. Stelle b als Summe von 2-er Potenzen dar, und multipliziere dann die entsprechenden Potenzen miteinander. Potenzgesetz: ac+d = ac * ad 6 4 1 0 Beispiel: 83 = 2 + 2 + 2 + 2 6 4 1 0 Also ist a83 mod n = a2 * a2 * a2 * a2 mod n Square and Multiply Wenn man b binär gegeben hat, nennt sich die folgende Variante des vorigen Algorithmus “Square-and-Multiply” (SaM) Beispiel b=83: ab = a83 = a1010011 mod n initialize square x := a mod n 1010011 x := x2 mod n 1010011 x := x2 * a mod n square and multiply x := x2 mod n x := x2 mod n 1010011 1010011 1010011 x := x2 * a mod n 1010011 square and multiply x := x2 * a mod n 1010011 square and multiply 83 Es gilt dann: x = a = a 1010011 mod n square square Wenn eine 1 kommt Dahinter steckt: Sei v die Binärdarstellung einer Zahl. Dann ist av0 = (av)2 und av1 = (av)2 * a Zusammenfassung Rechnen in Zn Addition, Subtraktion, und Multiplikation sind in Zn genau wie in Z, es bleibt jeweils nur die mod Operation zu berechnen. Division in Zn ist die Multiplikation mit dem multiplikativen Inversen (falls existent). Der Algorithmus zur Berechnung des multiplikativen Inversen ist der Erweiterte Euklid ggT Algorithmus (ist schnell). Potenzieren ab in Zn geht mit Square-and-Multiply.