TILL 2008 Klaus Böttcher -1([email protected]) Kryptografie mit Java Kryptografie als Themenschwerpunkt im niedersächsischen Zentralabitur Die niedersächsischen Fachberater haben für das Zentralabitur 2009 und 2010 Kryptographie statt Datenbanken als neuen Anwendungsschwerpunkt festgelegt. Der Informatiklehrer fragt sich, für welche unterrichtlichen Voraussetzungen er sorgen muss, um seine Schüler optimal auf das Zentralabitur vorzubereiten. Dabei ist der Umfang der drei „thematischen Schwerpunkte“ erfreulich gering: Algorithmen und Datenstrukturen bis zum Datentyp Schlange und „Nutzung eines vorgegebenen abstrakten Datentyps und Beurteilung bezüglich eines Anwendungsfalls“, ferner theoretische Informatik und im 13. Schuljahr Kryptografie. Thematischer Schwerpunkt 3: Anwendung von Hard- und Softwaresystemen sowie deren gesellschaftliche Auswirkungen Codierung - Analyse und Anwendung eines Codierungsverfahrens - Implementation eines Codierungsverfahrens Kryptologische Verfahren - Cäsar-, Vigenere-Verfahren - Analyse und Anwendung eines gegebenen klassischen kryptologischen Verfahrens oder einer Variante - Implementation eines klassischen Verfahrens - Asymmetrische Verschlüsselungsverfahren (prinzipielle Funktionsweise, ohne vollständige Algorithmen) Ergänzung für Kurse auf erhöhtem Anforderungsniveau – Kasiski-Test, Friedmann-Test Datenschutz und Datensicherheit - Beurteilung eines Anwendungsfalls bezüglich Datenschutzfragen - Erläuterung grundlegender Begriffe (Persönlichkeitssphäre, …) anhand selbst gewählter Beispiele - Authentifikation (nur 2009) Ein Blick in die Bundes-EPAs zeigt, dass dort das Thema Kryptologie aufgegriffen, aber nicht vertieft behandelt wird. Unter Interaktion mit und von Informatiksystemen findet man den Punkt „Datenschutz und Datensicherheit (z. B. Kryptologie, Zugriffskontrolle)“. Es gibt eine Aufgabe differenziert für den Grund- und Leistungskurs. Die unterrichtlichen Voraussetzungen für die Leistungskursaufgabe lauten: Im Unterricht wurden symmetrische und asymmetrische Verschlüsselungsverfahren behandelt. Bezüglich des RSA-Verfahrens sind die Algorithmen zur Schlüsselerzeugung, zum Ver- und Entschlüsseln von Nachrichten und zur Authentifizierung bekannt, geübt und implementiert worden. Die Prüflinge sind mit der Langzahlarithmetik und dem Rechnen modulo n vertraut, hingegen ist der Fermat-Test nicht bekannt. Sie kennen Verfahren zur Kryptoanalyse und die Komplexität des Faktorisierungsproblems. Aktuelle Einsatzbereiche von Kryptographie sind im Unterricht behandelt und diskutiert worden. TILL 2008 -2- Wie so oft im Informatikunterricht stellt sich die Frage: „Wie viel Mathematik muss/darf sein?“. Da für das Thema Datensicherheit fast ein ganzes Semester zur Verfügung steht, plädiere ich für eine solide mathematische Grundlage, die sicherlich nicht vom Mathematikunterricht bereit gestellt wird, aber Folgendes umfassen sollte: ● das Rechnen modulo n (addieren, multiplizieren, potenzieren), ● den erweiterten Euklidischen Algorithmus (zur Berechnung des modularen Kehrwerts), ● einen Algorithmus zum schnellen Potenzieren (analog zur ägyptischen Multiplikation) ● und den Satz von Euler-Fermat (aφ(n) = 1 mod n, wenn ggT(a, n) = 1) Dass diese mathematischen Voraussetzungen mit vertretbarem Aufwand bereitgestellt werden können, hat bereits Monika Seifert (1994, LOG IN 3/94, S. 34ff) gezeigt. Die dort vorgeschlagene Vorgehensweise zur Herleitung des RSA-Algorithmus wurde mehrfach im Unterricht mit Erfolg umgesetzt. Dieser Text, die Java-Programme und einige Arbeitsblätter werden im Internet auf informatik.halepaghen-schule.de veröffentlicht. Programme: Skytale1.java Aemult.java Euklid.java Fibonacci.java Affinlinear.java Euler.java Hashtest.java Falls noch Zeit bleibt, ein UDP-Chat-Programm aus: Start.java Anzeige.java Datenpaket.java UDPVermittler.java TILL 2008 -3- Ein- und Ausgabe in Java-Programmen Ein leidiges Thema ist das der Ein- und Ausgabe in Java-Programmen. Es ist unpraktikabel, zum Testen von Algorithmen und zur Erprobung kryptologischer Protokolle jedes Mal eine graphische Benutzeroberfläche zu entwerfen. Zwei einfache Klassen lösen dieses Problem. 1. Die Klasse Datei enthält zwei statische Methoden Datei.lies() und Datei.schreib(byte[] b) und lesen und schreiben Byte-Reihungen mittels eines Dateisauswahlfensters. 2. Die Klasse EinAusFenster ist von der Frameklasse abgeleitet, verfügt aber über Methoden (prompt...()), mit denen Zeichenketten, Ganzzahltypen, Fließkommazahlen und Wahrheitswerte eingegeben werden können. Ausgaben erfolgen in das zentrale Fenster vom Typ TextArea, dessen Inhalt mit liesTA() in eine Variable vom Typ String eingelesen wird. Zeichenketten werden mit schreibTA(String s) an das Ende des Textfensters angehängt und das ganze Fenster kann mit loeschTA() geleert werden. TextAreas sind editierbar (markieren, einfügen, löschen). Außerdem ist im EinAusFenster ein Mechanismus programmiert, dass Knöpfe die Methoden aktion1() bis aktion9() auslösen können. Dazu ruft der Konstruktor der Klasse, die das EinAusFenster erweitert, den Konstuktor vom EinAusFenster auf: super (new String[] {"Entschlüsseln", "Verschlüsseln"}; Die Zeichenketten-Reihung bewirkt hier, dass zwei Knöpfe mit der Beschriftung „Entschlüsseln“ und „Verschlüsseln“ erscheinen, mit welchen die Methoden aktion1() und aktion2() aufgerufen werden können. Beide Methoden werden passend überschrieben. Für Verschlüsselungsprogramme wünscht man sich zwei Textfenster. Das erreicht man mit einer leicht geänderten Klasse EinAusFenster2, die zusätzlich über die Methoden liesTA2(), schreibTA2() und loeschTA2() verfügt. Diese drei sehr schlichten Hilfsklassen „Datei“, „EinAusFenster“ und „EinAusFenster2“ ermöglichen es, sehr schnell kleine Programme mit grafischer Oberfläche zu schreiben. Auf Klassen aus der swing-Bibliothek wurde dabei bisher verzichtet. TILL 2008 -4S Transposition I E Die Skytale von Sparta als ältestes militärisches Verschlüsselungsinstrument ermöglicht die einfache Durchführung eines Transpositionsalgorithmus. Ohne Skytale behilft man sich, indem man nebenstehenden Skytalenstreifen in gleichlange Stücke schneidet und diese nebeneinander legt. (Dann wird das Ziel der Kryptographie erkennbar.) I Y H I T I E P I C I Das folgende Programm erweitert das EinAusFenster2 und zeigt seine Funktionsweise beispielhaft. N public class Skytale1 extends hps.EinAusFenster2{ E L T public Skytale1() { // Konstruktor super (new String[] {"Entschlüsseln", "Verschlüsseln", "Nachricht1", "Nachricht2"}); } public void aktion1 () { String geheimtext = liesTA(); // Eingabe = oberes TA int zeilen = 2; // Zeilenzahl von 2 bis Textlänge/2 schreibTA2(geheimtext.length()+" Zeichen\n"); while (zeilen <= geheimtext.length()/2) { schreibTA2("Umfang: "+zeilen+" Zeilen\n"); for (int j = 0; j < zeilen; j++) { for (int i = j; i < geheimtext.length(); i = i+zeilen) { schreibTA2(""+geheimtext.charAt(i)); } schreibTA2("\n"); } boolean weitermachen = promptBoolean("Neuer Versuch?"); if (!weitermachen) break; schreibTA2("\n"); zeilen++; } schreibTA2("\n"); } public void aktion2 () { } // fehlt noch public void aktion3 () { loeschTA(); loeschTA2(); schreibTA("MNCIOUHHRMSAGSBNEEES"); } public void aktion4 () { loeschTA(); loeschTA2(); schreibTA("SIEIYHITIEPICINLTEHSZDO!ETIEG_RDGRR_HAEKA_ESZRP"); } public static void main(String[] xy) { new Skytale1(); } } H S Z D O ! E T I G R D G R H A E K A E S Z R P TILL 2008 -5- Ägyptische Multiplikation und schnelle Potenzierung Der euklidische Algorithmus zur Bestimmung des ggT ist der älteste nicht-triviale Algorithmus. Die ägyptische Methode durch Verdoppeln und Addieren effizient zu multiplizieren ist noch älter, aber die Ägypter haben sie nur in Beispielen und nicht systematisch als Algorithmus dargestellt. Schöne Einstiegsbeispiele zu beiden Verfahren finden sich bei Bartholomé u. a. (1996). Die Autoren behaupten einfach, dass auf einem Papyrus die nebenstehende Liste gefunden worden sei. Heutige Schüler werden sehr schnell den dahinter stehenden Algorithmus erkennen und ein passendes Programm schreiben können. Dieses Verfahren ist auch für Computer von prinzipiellem Interesse und leicht aufs Potenzieren zu übertragen. prod x y prod+x·y 0 13 21 ? 13 13 20 ? 13 26 10 ? 13 52 5 ? 65 52 4 ? 65 208 1 ? 273 208 0 ? Aufgabe: Schreiben Sie ein Programm, das nach nebenstehendem Beispiel Potenzen berechnet. Verwenden Sie die Gleichungen bn = (b2)n/2, wenn n gerade, d. h. n % 2 == 0 bn = b·bn – 1, wenn n ungerade und zeigen Sie z. B.: 13779876543210987 % 10000 == 9153. Auch die Anzahl der benötigten Multiplikationen soll ausgegeben werden. Euklidischer Algorithmus pot Basis Exponent 1 1377 11 1377 1377 10 1377 6129 5 9633 6129 4 9633 4641 2 9633 8881 1 0673 8881 0 Berechne für jede Zeile pot · BasisExponent Auch zum ggT finden sich motivierende Beispiele bei Bartholomé u. a.: „Lassen sich mit zwei Stäben der Längen a = 15 m und b = 42 m genau 1 m abmessen?“ Da a = 3·5 m und b = 3·14 m ergibt ein Unterrichtsgespräch schnell, dass nur Vielfache von 3 m abgemessen werden können. Der erweiterte euklidische Algorithmus wird konstruktiv begründet. Bereits das folgende kleine Kommandozeilen-Programm demonstriert bei Zahlen mit mehr als 80 Ziffern, in wie wenigen Schritten der modulare Kehrwert ermittelt werden kann. Bei der Ausgabe wurde einiger Aufwand betrieben, weil dieselbe Rechnung im Unterricht häufig per Hand ausgeführt werden soll. import java.math.BigInteger; class Euklid { // zeigt, dass ggt(a,b) = k*a + n*b (k, n ganze Zahlen) // ermittelt ggf. den modularen Kehrwert static void anzeigen(BigInteger z, BigInteger m, BigInteger a, BigInteger b, BigInteger c, BigInteger d, BigInteger e, BigInteger f){ System.out.println(a+" = ("+c+")*"+m+"+("+d+")*"+z); System.out.println(b+" = ("+e+")*"+m+"+("+f+")*"+z); System.out.println("-----------------------"); } public static void main( String[] arg) { BigInteger z,m, a,c,d, b,e,f, q,r, x,y; TILL 2008 -6- z = new BigInteger(arg[0]); m = new BigInteger(arg[1]); a c d e f = = = = = m; new new new new b = z; BigInteger("1"); BigInteger("0"); BigInteger("0"); BigInteger("1"); anzeigen(z,m,a,b,c,d,e,f); int zähler = 0; //--------------------------------------while (a.mod(b).signum() > 0) { q = a.divide(b); r = a.mod(b); a = b; b = r; x = e; y = f; // e und f merken e = c.subtract(q.multiply(e)); f = d.subtract(q.multiply(f)); c = x; d = y; anzeigen(z,m,a,b,c,d,e,f); zähler++; } if (f.signum() < 0) f =f.add(m); //--------------------------------------if (b.equals(new BigInteger("1"))) System.out.println("Modularer Kehrwert:\n"+ "mod("+z+" * "+f+", "+m+ ") = 1\n"+zähler+" Schritte"); else System.out.println("ggT("+z+","+m+") = "+b); } } Dies kann genauso einfach und lehrreich mit einer Excel-Tabelle dargestellt werden, aber die JavaLösung mit der Klasse BigInteger hat den Vorteil, dass beliebig große Zahlen verarbeitet werden können und die Effizienz eindrucksvoll demonstriert wird. Der schlimmste Fall beim Verhalten von Euklids Algorithmus liegt vor, wenn die Eingaben zwei aufeinander folgende Fibonacci-Zahlen sind. Das zeigt aber wiederum, wie effizient der Algorithmus ist. F400 hat als Dezimalzahl 84 und F800 bereits 167 Ziffern. Wenn man beim Aufruf von Euklid zwei 80 Ziffern lange zufällige Zahlen eingibt, wird man selten mehr als 150 Divisionen beobachten und niemals mehr als 400 Schritte. F:\2008-TILL>java Euklid 55 89 89 = (1)*89+(0)*55 55 = (0)*89+(1)*55 34 = (1)*89+(-1)*55 21 = (-1)*89+(2)*55 13 = (2)*89+(-3)*55 8 = (-3)*89+(5)*55 5 = (5)*89+(-8)*55 3 = (-8)*89+(13)*55 2 = (13)*89+(-21)*55 1 = (-21)*89+(34)*55 ----------------------Modularer Kehrwert: mod(55 * 34, 89) = 1 8 Schritte class Fib { // druckt die n- und die // n+1-te Fibonaccizahl; // Eingabe in Euklid zeigt, dass der // ggT in n-2 Schritten ermittelt wird. public static void main(String[] arg) { int n = Integer.parseInt(arg[0]); int i = 0; BigInteger a = new BigInteger("0"); BigInteger b = new BigInteger("1"); BigInteger temp; while (i != n) { temp = a; a = b; b = a.add(temp); i++; } System.out.println(a+" "+b); } Aufgabe: Untersuchen Sie, ob der Aufruf java Euklid x 89 mit x < 89 den ggT in mehr als 8 Schritten berechnet. Testen Sie andere große Zahlen. } TILL 2008 -7- Addieren und multiplizieren Im Unterricht wird man zunächst, möglicherweise in Klasse 10/11, die monoalphabetische Verschlüsselung nach Cäsar behandeln Schlüssel a: e(x) = mod(x + a, n); d(y) = mod(y – a, n) und danach die affin lineare mit mehr (nämlich φ(n)·n – 1) möglichen Schlüsseln. Schlüsselpaar (a, b): Bernardo Provenzano, der Boss der e (x) = mod(a·x + b, n); Mafiabosse wurde 2006 nach 40 Jahren d(y) = mod(a–1(y – b), n). Es wird aber schnell deutlich, dass diese Verfahren leicht, z. B. bereits mit Zeichenhäufigkeitsanalyse zu überwinden sind und auch die Vigenère-Verschlüsselung (, die im niedersächsischen Zentralabitur verlangt wird,) ist nicht wesentlich sicherer. (Siehe Seite 19.) In Abiturkursen auf erhöhtem Anforderungsniveau werden der Kasiski- und der Friedman-Test zusätzlich vorausgesetzt, mit welchen die Schlüssellänge bei einer polyalphabetischen Substitution ermittelt werden kann. Das Brechen von affinlinearen Geheimtexten ist eine gute Vorübung für die spätere Behandlung von asymmetrischen, auf Potenzierung beruhenden Kryptosystemen. Aufgabe: Laden Sie den Text „wir910“ ins obere Fenster und entscheiden Sie, ob er nach „Cäsar“ verschlüsselt sein kann. Nehmen Sie an, dass das Leerzeichen und das 'e' die häufigsten Zeichen im Klartext sind und bestimmen Sie den Schlüssel (a, b) und entschlüsseln Sie den Text. Flucht aufgrund von Hinweisen in schlecht (Cäsar) verschlüsselten Kassibern gefasst. www.theregister.co.uk/2006/04/19/ mafia_don_clueless_crypto/ TILL 2008 -8- Folgende Lösung wurde auf dem TILL-2008 gefunden: Wenn das 36-mal auftretende Zeichen das Leerzeichen ist, dann wird wird 32 auf 42 abgebildet. Die gleiche Argumentation für das Zeichen 'e' lässt die Abbildung 101 → 151 vermuten. 101*a + b 32*a + b = 151 (modulo 256) = 42 (modulo 256) 69*a a a = 109 | 141; = 15369 =9 b b b = 42 – 32*9 = -246 = 10 weil mod(69*141, 256) = 1 (alles modulo 256) (alles modulo 256) Damit ist der Schlüssel gefunden: x*9 + 10 =y (alles modulo 256) x*9 = y – 10 | 57; weil mod(579, 256) = 1. Mit x = 57*y – 570 wird entschlüsselt, bzw. x = 57*y – 58, bzw. x = 57*y + 198 (alles modulo 256). Bemerkung: Die affin lineare Verschlüsselung kann in etwa einem Drittel eines Halbjahres behandelt werden. Die Schüler/innen haben dann Sicherheit im modularen Rechnen und der schnellen Ermittlung des modularen Kehrwerts. Zu diesem Zeitpunkt kann bereits eine Klausur geschrieben werden. Die Sch. kennen jetzt auch die Nachteile symmetrischer Verschlüsselung. Nun kann im Unterricht die schnelle Potenzierung (siehe Aemult.java) und die Herleitung des RSA-Algorithmus erfolgen, so dass man rasch zur Briefkasten-Analogie und zu kryptografischen Protokollen gelangt. TILL 2008 -9- Rechnen modulo n Kann man mit Resten rechnen? Baumann (2006) schlägt vor, auf das den Schülern schwer verständliche Zeichen ≡ für die Kongruenzbeziehung zu verzichten und empfiehlt wie in Derive die Schreibweise mod(a, n), also mod(1830, 31) = 1 statt 1830 mod 31 ≡ 1. Andere übliche Schreibweisen sind 1830 = 1 mod 31 oder 1830 = 1 (mod 31) oder wie es Schneier (1996) als Begründung für die Korrektheit der RSA-Verschlüsselung sinngemäß kurz schreibt: cd = (me)d = mk·(p-1)(q-1)+1 = m·mk(p-1)(q-1) = m·1 = m alles modulo n. Wenn es also genügend deutlich ist, dass modulo n gerechnet wird, dann muss nicht unbedingt hinter jeden Ausdruck (mod n) geschrieben werden. Andererseits akzeptieren Schüler keinesfalls Gleichungen wie 13 = 973, wenn nicht immer wieder ganz deutlich gemacht wird, dass jetzt modulo 96 gerechnet wird. In Grundkursen mit dem Thema Kryptografie habe ich immer wieder festgestellt, dass die Schüler zufrieden waren, wenn der Satz von Euler bewiesen und die Folgerung 2 (siehe Seiffert, 1994, S. 34) plausibel gemacht wurde. Insgesamt ist dieser mathematische Teil in 3 – 4 Stunden zu schaffen. Definition 0: Die Modulo-Funktion bildet eine ganze Zahl a auf die natürliche Zahl mod(a, n) ab. mod(a, n) := a – a/n·n , der Wertebereich ist {0,1,2,...,n–1} , n heißt der Modul, 0,1,2,...,n-1 heißen die Reste. Die Zahl a hat also die Darstellung a = r + k·n, mit r ∈ {0,1,2,...,n-1}. Achtung: Der Java-Operator % entspricht nur für natürliche Zahlen a und n der Modulo-Funktion. Beispiele: mod(42, 9) = 6, mod(-17, 10) = 3, weil 3 = -17 + 2·10, mod(103, 10) = 3 Definition 1: Zwei Zahlen heißen kongruent modulo n, wenn bei der Division der Zahlen a und b derselbe Rest bleibt. Man schreibt dann mod(a, n) = mod(b, n) oder a mod n = b mod n oder a = b (mod n) oder a ≡ b (mod n). Bemerkung: Wenn a mod n = a' mod n ist, dann gibt es eine ganze Zahl k mit a = a' + k·n, d. h., a und a' unterscheiden sich um ein Vielfaches von n. Für den Beweis des RSA-Algorithmus ist es nützlich, wenn den SchülerInnen bewusst ist, dass a und a' genau dann kongruent modulo n sind, wenn n die Differenz a – a' teilt. Beispiel: -17 mod 10 = 103 mod 10, wobei -17 = 103 + (-12)·10 oder 103 -(-17) = 120 = 12·10. Satz 1: Ist mod(a, n) = mod(a', n) und mod(b, n) = mod(b', n), so gilt: mod(a + b, n) = mod(a' + b', n) mod(a – b, n) = mod(a' – b', n) mod(a · b, n) = mod(a' · b', n) TILL 2008 mod(ak , n) -10= mod((a')k, n) Der Beweis sollte insbesondere für die dritte Gleichung geführt werden: a·b = (a' + k·n)·(b' + h·n) = . . . . = a'·b' + x·n, mit x = a'·h + b'·k + h·n. Definition 2: Die Anzahl der zu n teilerfremden Zahlen kleiner gleich n bezeichnet man nach Euler mit φ (n). Zwei Zahlen a und b sind dann teilerfremd, wenn der ggT(a, b) = 1 ist. n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ... 96 ... 100 φ(n) 1 1 2 2 4 2 6 4 6 4 10 4 12 6 8 8 16 6 18 8 12 ... 32 ... 40 Für den Lehrer ist es nützlich zu wissen, dass wenn p1e1·p2e2···pkek die Primfaktorzerlegung von n ist, φ(n) = (p1e1 – p1e1-1)(p2e2 – p2e2-1)···(pkek – pkek-1) gilt. Für Schüler ist es eine leichte Programmieraufgabe mittels ggT-Funktion eine Methode zur φ(n)Berechnung zu entwickeln und zu testen. Satz 2: Sind p und q zwei verschiedene Primzahlen, so ist φ(p·q) = (p – 1)·(q – 1). public class Euler { static int ggT(int a, int b) { if (b == 0) return a; else return ggT(b, a % b); } public static void main(String[] args) { int n = Integer.parseInt(args[0]); int phi = 0; for (int i = 1; i < n; i++) if (ggT(i,n) == 1) phi++; System.out.println("phi("+n+") = "+phi); } } Beweis: Von den p·q – 1 natürlichen Zahlen, die kleiner als p·q sind, muss man die (p – 1 ) Vielfachen von p und die (q – 1) Vielfachen von p abziehen und erhält p·q – 1 – (p – 1) – (q – 1) = p·q – p – q + 1 = (p – 1)·(q – 1) zu p·q teilerfremde Zahlen. Satz 3: (Satz von Euler) Sind m und n teilerfremde Zahlen (d.h., ggT(m, n) = 1), so gilt mod(mφ (n), n) = 1. Beweis: n n i=0 i=0 mod ∏ u i , n = mod ∏ m⋅u i , n = mod m n n ⋅∏ u i , n = mod m , n⋅mod ∏ u i , n n i=0 n 1 i=0 Ein Beweis gelingt mit obiger Gleichung unter Verwendung von Satz 1. Für SchülerInnen gut verständlich ist folgende Argumentation: u1, u2, ..., uφ(n) sind alle φ(n) zu n teilerfremden Zahlen und auch mod(m·u1, n), mod(m·u2, n), ..., mod(m·uφ(n), n) sind alle zu n teilerfremden Zahlen kleiner als n, nur in anderer Reihenfolge. Außerdem gilt mod(m·uj, n) ≠ mod(m·uk, n) für j ≠ k, denn sonst wäre n ein Teiler von m·(uj – uk), also uj – uk = 0. TILL 2008 -11- Folgerungen: 1. Ist p eine Primzahl, dann gilt mod(mp–1, p) = 1 (Kleiner Fermat). Beweis: Die Voraussetzungen von Satz 3 sind erfüllt. 2. Sind p und q zwei verschiedene Primzahlen, so gilt mod(mk·(p-1)·(q-1)+1, p·q) = mod(m, p·q). Ohne Beweis! Gute SchülerInnen mögen bemerken, dass bei Folgerung 2 die Voraussetzung, dass m und p·q teilerfremd sein müssen nicht immer erfüllt ist. Wenn Derive gut bekannt ist, reicht vielleicht ein Zahlenbeispiel: p = 13; q = 19; n = 243; φ(p·q) = 216. mod(1903·216 + 1, 243) = 190. Aber auch ein Beweis ist durchaus in der Schule möglich: Wenn m und p·q nicht teilerfremd sind, dann können p und q beide Teiler von m sein. In diesem Fall ist aber mod(m, p·q) = 0 und der Beweis ist trivial. Wenn nur p (aber nicht q) m teilt, dann gilt mod(m, p) = 0 und es folgt (1) mod(mk·(p-1)·(q-1)+1, p) = mod(m, p) und mod(mk·(p-1)·(q-1)+1, q) = mod(m, q) folgt ebenso leicht aus mod(m(q-1), q) = 1, bzw. mod(mk·(p-1)·(q-1), q) = 1. (2) Daraus folgt mod(mk·(p-1)·(q-1)+1, p·q) = m, was man besser erkennt, wenn man (1) und (2) umformuliert: (1') p teilt (mk·φ(p·q)+1 – m) und (2') q teilt (mk·φ(p·q)+1 – m) und damit folgt p·q teilt (mk·φ(p·q)+1 – m), also mod(mk·φ(p·q)+1, p·q) = mod(m, p·q). RSA-Verschlüsselung: n Produkt zweier Primzahlen p und q (diese müssen geheim bleiben; auch φ(n)) e relativ prim zu (p – 1)(q – 1) φ(n) = (p – 1)(q – 1); ggT(e, φ(n)) = 1 d privater Schlüssel d = e-1 mod φ(n) Verschlüsselung: c = me mod n Entschlüsselung: m = cd mod n Begründung: cd = (me)d = mk·(p-1)(q-1)+1 = m·mk(p-1)(q-1) = m·1 = m alles modulo n. In den Bundes-EPA findet sich die Teilaufgabe: Zeigen sie beispielhaft anhand der Zahlen p = 13 und q = 17 die Schlüsselerzeugung von n, e und d, wobei e = 7 sein soll. Verschlüsseln Sie die Nachricht m = 5. Lösungsskizze mit 6 von 50 BE im Anforderungsbereich II: Es ist n = p · q = 13 · 17 = 221 und (p - 1)(q - 1) = 12 · 16 = 192. Wegen 1 = 55 · 7 – 2 · 192 ist dann d = 55. Verschlüsselung: Wegen 57 = 78125 = 353 · 221 + 112 wird 5 zu 112 verschlüsselt. Für den Leistungskurs lautet die entsprechende Aufgabe: Beschreiben Sie das RSA-Verfahren und erläutern Sie an Hand eines Beispiels die Schlüsselerzeugung sowie die Ver- und Entschlüsselung. TILL 2008 -12- Potenzieren Potenzierung führt jetzt zum RSA-Verfahren und asymmetrischer Verschlüsselung, so dass anspruchsvolle kryptografische Protokolle behandelt werden können. Kryptografen denken sich gerne ausgefallene Protokolle aus, nur um zu überlegen, ob sie durchführbar sind und welchen Angriffen sie standhalten. (Beispiel: Wie kann eine Gruppe von Leuten ihr Durchschnittsgehalt ermitteln, ohne die anderen vom eigenen Gehalt in Kenntnis zu setzen? Schneier, 1996) Briefkasten-Analogie: e=3 Jeder kann eine mit dem öffentlichen Schlüssel eA verschlüsselte Nachricht an den Teilnehmer A schicken (in den Briefkasten werfen) und nur A kann diese mit Hilfe des privaten Schlüssels dA lesen (aus dem Briefkasten heraus holen). Mit dieser Analogie kann man sich Sicherheitsprotokolle zur Durchführung verschiedenster Aufgaben ausdenken. Im Bild soll z. B. folgende Aufgabe im mündlichen Abitur gelöst werden: n = 187 d = 107 S 92 98 Firma A: 21, 98 Firma B: 20, 92 ... Internet-Seite 21 e=23 20 d=7 A e=27 d=83 Mehrere Firmen sollen für den Bau B einer Fabrik ein preisliches Angebot (in Mio. Euro) einreichen. Damit sie sich nicht gegenseitig einfach unterbieten können, darf keine vom Angebot der anderen vor der Einreichung des eigenen Angebots erfahren. Die Firmen sollen sich aber auch überzeugen können, dass niemand das Protokoll missbraucht hat und doch auf diese Weise die anderen Angebote unterboten hat. In einer mündlichen Prüfung sollte folgendes Protokoll untersucht werden: 1. 2. 3. 4. Die Signaturbehörde S wählt einen Modul n (n=187=11⋅17) und erzeugt für sich und die Firmen jeweils einen geheimen Schlüssel d und einen öffentlichen Schlüssel e. Am 1. Juli werden die Angebote (in Mio. €) von der staatlichen Signaturbehörde S signiert, ohne dass konkurrierende Firmen den geforderten Preis anderer Firmen erfahren. Am 2. Juli veröffentlichen die Firmen ihre Angebote samt Signatur im Internet. Das preislich niedrigste Angebot wird gewählt. a) Erläutern Sie das gegebene Protokoll und beschreiben Sie, wie man es mit Hilfe der RSAVerschlüsselung durchführen kann. Was müsste noch besser geregelt sein? b) ♦ Firma B will die Fabrik für 20 Mio. DM errichten. Hat sie mit (20, 92) ein korrekt signiertes Angebot eingereicht? ♦ Wie kann im gegebenen Beispiel die Signaturbehörde S aus ihrem geheimen Schlüssel e = 107 den öffentlichen Schlüssel d = 3 berechnen? TILL 2008 -13- c) Firma A will ihr Angebot x = 21 vor der Signaturbehörde S geheimhalten: ♦ A berechnet den modularen Kehrwert von 10 mod 187 = 131 und ♦ sendet x = 21⋅103 mod 187 = 56 an S und erhält 56107 mod 187 = 45 zurück. ♦ Daraus berechnet A die Signatur 98 = 45⋅131 mod 187. Dieses Protokoll stellt sicher kein brauchbares Verfahren dar, ein Dokument mit einem Zeitstempel zu versehen. Aber den Schülern soll ja Gelegenheit gegeben werden, Schwachpunkte zu entdecken. Ein Fehler in diesem Protokoll ist z. B., dass man sich mehrere Angebote signieren lassen kann, um dann das passende zu veröffentlichen. Hash-Werte Viele kryptografische Protokolle verwenden Hashwerte, z. B. zur Signierung oder weil mit RSA lange Nachrichten nicht effizient verschlüsselt werden können. In Java besitzt jedes Objekt eine Methode hashCode(), die für verschiedene Zwecke genutzt wird. Stringobjekte liefern folgende Ganzzahl vom Typ int int c = s[0]·31n-1+s[1]·31n-2+...+s[n-1]. (s[i] Ordinalzahl des i-ten Zeichens; n Länge der Zeichenkette s). Der Algorithmus ist schnell codiert und kann ggf. für den Unterricht noch weiter vereinfacht werden, indem statt modulo 2147483647, wie es das Java-System es mit 32-Bit-Zahlen vom Typ int macht, z. B. modulo 1000 gerechnet wird. public class Hashtest { static int hashwert(String s) { int n = s.length(); int h = 0; for (int i=0; i < n-1; i++) { h = (h + s.charAt(i))*31; } return h + s.charAt(n-1); } public static void main(String[] args) { System.out.println(args[0].hashCode()); System.out.println(hashwert(args[0])); } } Der Aufruf: F:\2008-TILL>java Hashtest "Buxte-Bau bietet Festpreis von 255000 Euro." liefert beide Male 1806346327. Wird der Betrag in 245000 Euro gefälscht, dann ergibt sich zweimal -691669610 Die Schüler werden die Sicherheit dieses Hash-Werts gerne kritisch testen und weitere Anwendungsfälle mit Interesse untersuchen. Ein Aspekt von Hash-Werten kann an Hand des folgenden Zitats diskutiert werden: „Das Auffinden von Dateien aufgrund des Hash-Wertes ihres Inhaltes ist zumindest in den USA als Softwarepatent geschützt. Der Inhaber (www.altnet.com) verfolgt Programme und Firmen, die auf Basis dieses Verfahrens die Suche von Dateien ermöglichen, einschließlich Firmen, die im Auftrag von RIAA oder MPAA Anbieter von unlizenzierten Inhalten ermitteln wollen.“ (Quelle: de.wikipedia.org/wiki/Hash-Wert) Aufgabe: Finden Sie einen Hash-Wert, für obiges Angebot, bei dem der Preis von 255000 Euro unterboten wird. Schätzen Sie den Aufwand hierfür ab. TILL 2008 -14- Fazit: Der bisher dargestellte Unterrichtsgang konnte in dreistündigen Kursen bequem geschafft werden, ohne dass bei der Herleitung der RSA-Verschlüsselung zu bloßen Plausibilitätsbetrachtungen Zuflucht genommen wurde. Trotzdem sollte dieser Teil möglichst schnell behandelt werden, um genügend Zeit zu haben für die vielen interessanten mit der modernen Kryptografie verbundenen Informatik-Themen, insbesondere die kryptografischen Protokolle und das Recht auf informationelle Selbstbestimmung. Zeit gewinnen kann man im Unterricht z. B. dadurch, dass bei der affin linearen Verschlüsselung nur modulo 256 gerechnet wird. Auch weiterer Aufwand bei der klassischen symmetrischen Verschlüsselung lohnt für den Informatikunterricht kaum. Vigenère-Verschlüsselung und KasiskiTest sind in einer Doppelstunde oder in einer Klausuraufgabe (siehe S. 18) unterzubringen, aber der Friedman-Test bringt wenig Neues und erfordert zuviel Mathematik. (Man vergleiche die Darstellung beider Tests auf wikipedia.de.) Zeit investieren sollte in die Programmierung eines kleinen Chatprogramms auf Basis von UDP. Dabei können viele Sicherheitsfragen praktisch beantwortet werden: „Wie verabrede ich ein Kennwort mit einem Partner, wenn alle zuhören?“, „Wie verhindere ich, dass ich mit Spam überschüttet werde?“ oder „Kann eine UDP-Verbindung so sicher gemacht werden wie bei TCP?“. TILL 2008 -15- Theoretische Informatik: Ganze Zahlen im Computer Als eine mathematische Vorraussetzung muss geklärt werden, wie Zeichen in Java codiert sind und warum alle Ganzahltypen grundsätzlich vorzeichenbehaftet sind. Das könnte in Niedersachsen im Schuljahrgang 12 bei der Behandlung einer Subtrahierschaltung geschehen: Thematischer Schwerpunkt 2: Funktionsprinzipien von Hard- und Softwaresystemen einschließlich theoretischer bzw. technischer Modellvorstellungen - Elementare Schaltnetze (bis zum umschaltbaren Parallel-Addierer / Subtrahierer) ← Befehlssteuerleitung Da in der modernen Kryptographie auf Bit-Ebene gearbeitet wird, ist es wichtig zu wissen, wie Zeichenketten und insbesondere Ganzzahltypen im Computer codiert werden. Die Grundlagen für ein vertieftes Verständnis können bei der Behandlung von Schaltnetzen gelegt werden: ADD/ SUB Nach der Behandlung elementarer Schaltnetze wird den Schülern die Aufgabe gestellt, ein Schaltnetz zu entwickeln, 0 0000 1 0001 mit dem zwei Zahlen wahlweise addiert bzw. subtrahiert -1 1111 2 0010 werden können. Im vorgegebenen Prinzipschaltbild erkennt -2 1110 man links je vier Eingabeleitungen für die beiden Summanden 3 0011 -3 1101 bzw. für Minuend und Subtrahend. Das Ergebnis und ein eventueller Übertrag sollen rechts erscheinen. Zusätzlich gibt -4 1100 4 0100 es oben noch eine Leitung zur Befehlseingabe (0=Addition, -5 1011 5 0101 1=Subtraktion). -6 1010 Zunächst wird die Frage untersucht, wie viele ganze Zahlen 6 0110 -7 1001 sich nun in dieser Schaltung darstellen und verarbeiten lassen. 7 0111 1000 -8 Maximal 16 Zahlen sind mit vier Leitungen (= 4 Bit) darstellbar, wobei die Darstellung der positiven Zahlen von 1D = 0001B bis 7D = 0111B offensichtlich ist. Die schriftliche Addition mit Übertrag funktioniert wie im Dezimalsystem: –7 –6 –5 –4 –3 –2 –1 0 00001 1 +00001 1 Ü 1 -----0010 2 0101 5 +0001 1 1 ----0110 6 0011 3 +0011 3 11 ----0110 6 1111 x +0001 1 111 ----(1)0000 0 0011 3 +1101 x 111 ----(1)0000 0 1 2 3 4 5 6 7 0101 5 +1011 x 111 ----(1)0000 0 Die drei rechten Additionen führen weiter: Offenbar steht x hier für –1, –3 und –5, denn die Summe ist bis auf den Übertrag (1) jeweils null. Insbesondere halten wir fest, dass -1D = 1111B gilt. Wenn der Zahlenstrahl bei 0 fixiert und um den Zahlenkreis gewickelt wird, dann stehen -1, -3 und -5 bereits an der richtigen Stelle links von der Null. Auf jede Position fallen unendlich viele Zahlen. Auf die Position der 5 fallen 21, 37,.., aber auch -12, -28, usw. Zur 10 gehören 26, 42, -6, -22, usw. TILL 2008 -16- Wir rechnen also modulo 24=16 und es ist vorteilhaft für Positionen rechts positive ganze Zahlen und links negative zu wählen. Damit erkennt man negative Zahlen in der 4-Bit-Darstellung an der führenden 1. Einige weitere Rechnungen bestätigen, dass der Zahlenkreis sinnvoll beschriftet ist. 1111 -1 +1111 -1 Ü 111 ----(1)1110 -2 1011 -5 +1110 –2 11 -----(1)1001 -7 1101 -3 +1011 -5 111 ----(1)1000 -8 Um zu einer Zahl die Gegenzahl zu finden, reicht es nicht, alle Binärziffern zu invertieren, dann ist die Summe von Zahl und dem Einerkomplement nur 1111B = –1D. Es muss noch 1 addiert werden, um 0 zu erhalten. 1010 -6 +0101 5 ----1111 -1 0101 5 +0001 1 -----0110 6 1010 -6 +0110 6 ----(1)0000 0 Die Gegenzahl –x einer Zahl x (positiv oder negativ) wird durch Invertierung aller Binärziffern von x mit anschließender Addition von 1 gebildet. Negative Zahlen erkennt man am führenden Bit, das gesetzt (=1) ist. 2 Rechnet man mit n = 4 Bit, dann können 24 = 16 Zahlen dargestellt wwerden und 10000B = 16D = 0 (mod 16). Üblich sind heute Wortlängen von n=8, n=16, n=32 oder n=64. Die bisherigen Überlegungen gelten dann entsprechend. Für n = 8 lassen sich die Zahlen von –128 bis 127 darstellen, der in Java besonders wichtige Zahlentyp Byte. Die SchülerInnen sollten später nachvollziehen können, warum in Java (und auch Prolog) -22 % 16 == -6 (und nicht 10) gilt. Die Binärdarstellung von Zahlen lässt sich gut mit dem Rechner von Windows ( start->Ausführen>calc) demonstrieren. Gibt man -80, den Bytecode des Grad-Zeichens '°', ein, dann zeigt die Binärdarstellung 1111 1111 1011 0000 bzw. 1011 0000 an, abhängig davon, ob word oder bin aktiviert ist. Zurück zur Dezimaldarstellung werden nicht -89, sondern 65456 bzw. 176 (Hex: FFB0 bzw. B0) angezeigt. Übungen: 1. Man rechne 5+(-3), -4+7, -3+(-3), 5+(-7), -3-5, 3-(-5), usw. im Dualsystem 2. Wann tritt ein Überlauf auf, d. h. wann ist das Ergebnis größer als 7 oder kleiner als –8? Wie kann ein solcher Überlauf im ADD/SUB-Schaltnetz erkannt werden? 3. Erläutern Sie die Rechnung 5-3=2 mit Hilfe des Schaltnetzes. Kann man in der Abb. Auch die Rechnung 5+12+1 = 18 erkennen? TILL 2008 -17- Aufgabe 1 a) Berechne: Rechnen mit Resten; Zeichenstatistik -2 (mod 12); 8*4*6 (mod 7); (-5)*(-5)*(-5)*(-5) (mod 7); 9*57 (mod 256) und ohne Rechnung: x*5 = 1 (mod 7). b) Berechne ausführlich 88819 (mod 1000) und notiere eine möglichst effiziente Methode public int potmod1000( int b, int n). c) Mit der Anweisung "byte[] xtext = Datei.lies();" werden ASCII-Werte in die ByteReihung xtext gelesen. Mit " int[ ] haeufigkeit = new int[128]; " wird eine Reihung haeufigkeit [0], haeufigkeit [1], ... , haeufigkeit [127] initialisiert und jeweils mit 0 vorbelegt. In haeufigkeit [i] soll gezählt werden, wie oft das Zeichen mit dem ASCII-Code i in der Datei vorkommt. ( In haeufigkeit [65] also die Häufigkeit von A; es werden nur ASCII-Werte von 0 bis 127 berücksichtigt.). ♦ Schreiben Sie ein Programmstück, das die Reihung haeufigkeit mit den Häufigkeiten der Reihung xtext belegt. d) In deutschen Texten sind das e (17,40 %) und das n (9,78 %) und das s (7,27 %) die häufigsten Buchstaben. ♦ Schreiben Sie ein Programmstück, das die Indizes der beiden häufigsten Variablen der Reihung haeufigkeit ausgibt. Aufgabe 2 a) Affine Verschlüsselung public void aktion2 ( ) { // Verschlüsseln int a = 27; int b = 100; // Schlüsselpaar byte[] xtext = Datei.lies(); for (int i = 0; i < xtext.length; i++) xtext[i] = (byte)((xtext[i] * a + b) % 256); Datei.schreib(xtext); } Abb. 1 Textdateien werden mit der Methode aus Abb. 1 verschlüsselt. ♦ Auf welche ASCII-Zeichen werden die Buchstaben A und B abgebildet? ♦ Berechnen Sie den modularen Kehrwert von 27 modulo 256. Der Rechenweg soll erkennbar sein. ♦ Welche Zahlen müssen für a und b gesetzt werden, damit mit aktion2() verschlüsselte Dateien wieder entschlüsselt werden können? b) Inzwischen wurden die Zahlen für a und b verändert, aber ein Angreifer hat erkannt, dass 110 (ASCII-Code von n) auf 172 (bzw. –84, was gleichwertig ist) und 101 (ASCII-CODE von e) auf 45 abgebildet werden. Zeigen Sie, dass mit diesem Wissen die Parameter a und b, die den Schlüssel bilden (siehe Abb.1), berechnet werden können. Worauf würde also der Buchstabe A abgebildet werden? TILL 2008 -18- Erwarte Leistung in Stichworten 1a 1b -2 = 10 (mod 12); 8*4*6 = 3 (mod 7); (-5)4 = 2 (mod 7); 9*57 = 1 (mod 256); x*5 = 1 (mod 7) → x = 3 88819 = 552 (mod 1000) ausführlich berechnet. int potmod1000(int b, int n) //iterativ oder rekursiv I II III 3 4 6 3 13 4 int potmodrekursiv(int b, int n) { // rekursiv ist eleganter! if ( n == 1 ) return b; else if (n%2 == 0) return potmodrekursiv(b*b %1000, n/2); else return potmodrekursiv(b, n-1) * b % 1000; } 1c 5 Reihung haeufigkeit belegt 5 haeufigkeit = new int[128]; for (int i = 0; i < xtext.length; i++) { code = xtext[i]; if ( code > 0 ) { haeufigkeit[code]++; } } 1d 7 Indizes vom 1. und 2. Maximum werden gefunden int max = 0; int index = 0; for ( int i = 0; i < 128; i++ ) { if ( haeufigkeit[i] > max ) { max = haeufigkeit[i]; index = i; } } // Danach haeufigkeit[index] = 0; und dasselbe noch einmal. 5 2 13 2a 2b A → 65 → 65 27+ 100 = 63 (mod 256) → ? B → 66 → 66.27+ 100 = 90 (mod 256) → Z 27-1 = 19 (mod 256) mit Rechenweg y = x.27+100 nach y aufgelöst/ a' = 19 und b' = 148 berechnet 2 2 Zwei Gleichungen mit den Unbekannten a und b aufgestellt nach a = 9 aufgelöst und b = 120 (mod 256) ermittelt p wird auf h abgebildet 2 . Sorgfalt 5 4 11 5 3 1 1 1 TILL 2008 Aufgabe 1 -1913/1 Kryptographie; Nachteile symmetrischer Verschlüsselung a) Textdateien werden mit dem Programm aus Abb. 1 verclass Verschluesseln { public static void main( String[] arg) { schlüsselt. int a = 205; int b = 10; ♦ Auf welche ASCII-Zeichen byte[] xtext = Datei.lies() ; werden die Buchstaben A und a for (int i = 0; i < xtext.length; i++) xtext[i] = (byte)((xtext[i] * a + b) % 256); abgebildet? Datei.schreib(xtext); ♦ Berechnen Sie den modularen } Kehrwert von 205 modulo 256. } Abb. 1 Der Rechenweg soll erkennbar sein. ♦ Wie müssen die Werte für a und b verändert werden, damit verschlüsselten Dateien wieder entschlüsselt werden können? b) Ein Angreifer hat erkannt, dass 110 (ASCII-Code von n) auf 128 und 101 (ASCII-CODE von e) auf 127 abgebildet werden. Zeigen Sie, dass mit diesem Wissen die Parameter a und b, die den Schlüssel K bilden (siehe Abb.1), berechnet werden können. c) Eine Firma (Trent) bietet im Internet an, digitale Signaturen zu garantieren, und vereinbart mit allen ihren Kunden jeweils einen Schlüssel KA, KB, KC,... nach dem obigen Verschlüsselungsverfahren − allerdings mit sehr viel größeren Zahlen a und b. Alice möchte einen Vertrag per E-Mail mehreren Kunden B, C, D,... der Firma Trent zukommen lassen. Dieser Vertrag soll signiert sein, d. h., es sollen dieselben Sicherheiten wie bei einer Unterschrift unter einem schriftlichen Dokument gewährleistet sein, als da sind: 1. Eine Unterschrift ist authentisch. 2. Sie ist fälschungssicher. 3. Die Unterschrift kann nicht wiederverwendet werden. 4. Das unterschriebene Dokument kann nachträglich nicht mehr verändert werden. 5. Die Unterschrift kann später nicht abgestritten werden. ♦ Notieren Sie die einzelnen Punkte eines Protokolls, mit dem Alice den signierten Vertrag B, C, D,... zukommen lassen kann. (Die Kunden von Trent vereinbaren untereinander keine Schlüssel!) ♦ Untersuchen Sie, ob die Vorteile einer Unterschrift auf Papier auch hier gegeben sind. ♦ Welche Vorteile bietet die RSA-Verschlüsselung bei der elektronischen Signatur gegenüber der hier verwendeten? TILL 2008 Aufgabe 2 13/1 -20Kryptographie; Vigenére Schlüsselwort:denkendenkendenkendenkenden Klartext: achtungumdreizehnuhrabgeben a) Erläutern Sie kurz, wie der verschlüsselte Text im unteren Fenster entstanden ist. void aktion2() { byte[] schlüssel = liesTF().getBytes(); int v = schlüssel[0]-97; byte[] b = liesTA().getBytes(); for ( int n=0 ;n < b.length; n++ ) { if ( 97 <= b[n] && b[n] <= 122 ) { b[n] = (byte)((b[n] -97+ v)%26 + 97); } } // Ende for loeschTA2(); schreibTA2(new String(b)); } b) Im Jahre 1586 wurde die sogenannte Vigenère-Verschlüsselung veröffentlicht. Dabei wird das Schlüsselwort solange über den Klartext geschrieben, bis die Länge des Klartexts erreicht ist. Im Beispiel wird also das erste a mit d und das a von abgeben mit n verschlüsselt. Schreiben Sie die Methode aktion2 neu, so dass ein Klartext mit Hilfe eines Schlüsselworts im oberen Textfeld verschlüsselt wird. c) Der Knopf "max" soll mit einer Aktion belegt werden, die die Häufigkeit des am häufigsten auftretenden Zeichen ausgibt. d) Ein Anklicken der Taste Position soll alle Abstände zwischen zwei benachbarten maximal häufigen Zeichen ausgeben. Aufgabe 3 Semester 12/2 EinAusFenster2 -----------------int promptInt(String s) schreibTA(String s) loeschTA() String liesTA() schreibTA2(String s) loeschTA2() String liesTA2() schreibTF(String s) loeschTF() String liesTF() hilfe() aktion1() ... aktion10() Automaten Ein Automat gibt nach der Eingabe von 4 Euro eine Tafel Schokolade aus und läßt diese vier Euro in den Hauptspeicher fallen. Im Jahre 2002 soll es 1- und 3-Euro-Münzen geben. Man soll nicht zu viel Geld einwerfen können. a) Zeichnen Sie den Transitionsgraphen dieses Automaten. Schreiben Sie ein Prologprogramm, das diesen Automaten simuliert. Als Ausgabe soll nichts, freigabe oder münze_zurueck erscheinen. Verzichten Sie auf jegliche Bildschirmkosmetik: Ein- und Ausgaben mit read und write. b) Kodieren Sie die Zustände und die Ein- und Ausgabe geeignet und notieren Sie eine Schaltwerttabelle. Geben Sie für die Bits des Folgezustands s1´ und s0´ und die Ausgabebits a1 und a0 boolesche Terme an. Vorschlag für die Kodierung: TILL 2008 -21- Eingabe: Ausgabe: Kodierung e=0 e=1 a1 = 0 a0 = 0 a1 = 0 a0 = 1 a1 = 1 a0 = 0 Bedeutung r: 3 Euro einwerfen g: Euro einwerfen n: nichts passiert z: Münze zurück f: Freigabe c) Skizzieren Sie ein Schaltwerk mit möglichst wenigen Gattereingängen. S0 ’ S0 Taktleitungen können fehlen; für Speicherelemente genügt folgende Darstellung: Erwarte Leistung in Stichworten I 1a 97 → 183; 65 → 23 Kehrwert von 205 mod 256 schriftlich berechnen und y ≡ x⋅205 + 10 nach x auflösen 2 1b 2 Gleichungen mit 2 Unbekannten, nach a auflösen mod. Kehrwert von 9 bestimmen und nach b auflösen (a = 57; b = 2) 3 1c Protokoll Beurteilung der Sicherheit Vorteile asymmetrischer Verschlüsselung beim Signieren II III 4 4 4 3 4 2 1 10 17 2a Rotation der Kleinbuchstaben um 3 3 2b Vigenére 3 2c Häufigstes Zeichen gefunden 2d Verteilung des häufigsten Zeichens 1 1 3 5 2 8 2 gestrichen, wg. Zeitmangel (Klausur unter Abiturbedingungen) 6 3a 3b 3c Transitionsgraph 8 Prolog Fakten beschreiben den Automaten Ablaufprädikat 4 4 3 Schaltwerttabelle 4 boolesche Terme, vereinfacht Schaltwerk mit Übergangsschaltnetz und Ausgabeschaltnetz 4 4 2 2 5 10 16 2 TILL 2008 Aufgabe -2213/1 Kryptographie; Digitales Geld Eine Bank gibt digitale Zehnmarkscheine auf folgende Weise an ihre Kunden aus: 1. Sie erzeugt mit Hilfe der Klasse RSAGenerator (siehe Anlage 1) eine Zahl n, als Produkt zweier großen Primzahlen, sowie einen Schlüssel e, den Sie geheim hält, und eine Zahl d, die sie zusammen mit n als öffentlichen Schlüssel bekannt gibt. 2. Für jeden digitalen Geldschein wird eine eigene Zufallszahl z bestimmt. Die Ziffern dieser Zahl werden doppelt notiert (z = 4712 wird also zu dz = 44771122). Diese "Doppelzahlen" werden mit dem Schlüssel e verschlüsselt und die verschlüsselte Zahl als digitales Geld an die Kunden ausgegeben, wobei die Bank das Kundenkonto entsprechend belastet. 3. Jedem, der eine solche „Doppelzahl“ vorlegt, wird sie von der Bank erstattet. Die Bank akzeptiert mit Hilfe ihrer Datenbank jede Zahl aber nur einmal. a) Aus Sicherheitsgründen soll in der Klasse RSAGenerator (Anlage 1) die Methode neuesPaar() so ergänzt werden, dass sie den Wert true zurückgibt, wenn die Zahl 123456789 mit den gerade erzeugten Zahlen e und d korrekt ver- und wieder entschlüsselt werden kann. b) Notieren Sie eine Methode istDoppelZahl(BigInteger dz), die genau dann den Wert true liefert, wenn dz eine in das obige Muster passende Zahl mit doppelt auftretenden Ziffern darstellt. c) ♦ Die Bank hat n = 187 und d = 107 veröffentlicht. Faktorisieren Sie 187 und zeigen Sie anhand einer ausführlichen Rechnung, wie man den geheimen Schlüssel e berechnen kann. (Ergebnis e = 3) ♦ Die Bank erzeugt die Zufallszahl z = 5 und daraus dz = 55. Welche Zahl stellt den digitalen Geldschein dar? ♦ Kann jedermann kontrollieren, ob eine Zahl eine digitale Banknote darstellt? Begründung! c) Beurteilen Sie die Vor- und Nachteile*) digitaler Banknoten im Vergleich mit realen Geldscheinen. Erläutern Sie, welcher Nachteil dieses Verfahrens mittels verdeckter Signierung behoben werden könnte. *) Setzen Sie dabei voraus, dass die Zahlen genügend groß sind. import java.math.BigInteger; import java.util.Random; public class RSAGe ne rator { // e rze ugt Schlüs se lpaare ; private BigInteger n, e, d, phi; private int laenge; // w ird durch ne us tart(int) fes tge le gt private Random zGenerator = new Random(); public RSAGenerator(int laenge){// Konstruk tor neustart(laenge); } public void neustart(int l){ BigInteger p = ne w BigInteger(l, 20, zGenerator); BigInteger q = ne w BigInteger(l, 20, zGenerator); n = p.multiply(q); BigInteger one = n.valueOf(1); phi = p.subtract(one).multiply(q.subtract(one)); laenge = l; neuesPaar(); } public void neuesPaar(){// n ble ibt e rhalte n e = new BigInteger(laenge, 20, zGenerator); d = e.modInverse(phi); } public BigInteger getn() {return n;} public BigInteger gete() {return e;} public BigInteger getd() {return d;} } a Test eingebaut b istDoppelZahl(BigInteger dz) c p = 11, q = 17, phi = 160, modularen Kehrwert e = 3 berechnen w = 132 Prüfschlüssel anwenden d Kritische Erörterung − keine Anonymität, Lösung des Anonymitätsproblems 5 6 2 3 2 2 4 3 TILL 2008 Aufgabe -2313/1 Kryptographie; Wahl im Parlament In einem Parlament soll nach folgendem Protokoll elektronisch gewählt werden: Das Parlamentsrechenzentrum, das Präsidium und jeder Abgeordnete besitzen zu einem gemeinsamen RSA-Modul n je einen geheimen Schlüssel e und einen öffentlichen Schlüssel d. 1. Der Abgeordnete erzeugt eine sehr große Zufallszahl z und fügt vor jeder Ziffer b dieser Zahl eine Ziffer a ein, so dass a + b mod 10, die Nummer des gewünschten Kandidaten ergibt. Beispiel: z = 5704 → w = 85673094, also Kandidat Nr. 3. 8+5=13, 6+7=13, 3+0=3, 9+4=13 2. Jeder Abgeordnete lässt sich seine Zahl w vom Rechenzentrum signieren, d. h. er sendet w ans Rechenzentrum und erhält wR zurück. R ist der geheime Schlüssel des Rechenzentrums. Das Rechenzentrum signiert jedem Abgeordneten nur eine Zahl. 3. Zum Zeitpunkt der Wahl sendet jeder Abgeordnete seinen Stimmzettel wR anonym über einen MIX ans Präsidium, welches alle Wahlzettel veröffentlicht und die Wahl auswertet. − a) Notieren Sie eine Methode „int gewählt(BigInteger w)“, die zu einer Zahl vom Typ BigInteger entweder die Nummer des Kandidaten, 0 für Enthaltung oder -1 beim Auftreten eines Fehlers zurückgibt. Hinweis: toString() wandelt BigIntegerobjekt in ein Stringobjekt, getBytes() wandelt ein Stringobjekt in eine Reihung vom Typ byte[]. b) Das gegebene Protokoll soll an einem sehr einfachen Zahlenbeispiel erläutert werden: n sei 253, der Abgeordnete erzeugt die Zufallszahl z = 8 und wählt Kandidat 1. Das Rechenzentrum besitzt den öffentlichen Schlüssel S = 151. Faktorisieren Sie 253 und berechnen Sie ausführlich den geheimen Schlüssel R des Rechenzentrums. (Lösung: R = 51) Stellen Sie die Zahlen, die zwischen den beteiligten Partnern bei der Wahl übermittelt werden, in einer einfachen Skizze dar. c) Einige Abgeordnete stört, dass ihre Wahl vom Rechenzentrum erkannt werden kann. Berechnen Sie schriftlich 10−1 mod 253, den modularen Kehrwert von 10, und erläutern Sie im obigen Zahlenbeispiel, wie der Abgeordnete sich seinen Stimmzettel w verdeckt signieren lassen kann. Ergänzen Sie Ihre Darstellung in Aufgabenteil b). d) Erörtern Sie, ob bei elektronischen Wahlen nach diesem Protokoll dieselben Vorteile und Sicherheiten wie bei einer Wahl per Stimmzettel gegeben sind. Hilfsmittel: Ti-92 mit den Befehlen factor und mod I II III a Java-Methode 3 b Faktoriseren und w bestimmen ϕ (253) = 220 als Modul erkennen R = 51 mit erweitertem euklidischem Alg. Skizze mit allen ermittelten Zahlen 2 2 c d 10−1 mod 253 = 76 schriftlich berechnet Blinde Signatur erklärt und vorgerechnet Kritische Erörterung 3 In 13/1 wenig programmiert RSA-Verschlüsselung bekannt 4 Tabellarisches Verfahren geübt Ähnliche Darstellungen behandelt 4 2 Kurz im Unterricht behandelt 2 3 3 2 Im Unterricht nur kurz behandelt TILL 2008 Aufgabe -2413/1 Kryptographie; Wahl im Internet Bei einer Wahl per Internet sollen 7 Kandidaten gewählt werden. Jeder Wähler kann kann sich beim Wahlleiter folgendermaßen einen Wahlschein besorgen: 1. Der Wahlleiter W erzeugt eine Zahl n als Produkt zweier Primzahlen p und q, sowie einen öffentlichen Schlüssel e und einen geheimen Schlüssel d. 2. Der Wähler A (Alice) erzeugt eine sehr große Fibonacci-Zahl z und schickt sie dem Wahlleiter W. Dieser verschlüsselt sie mit dem geheimen Schlüssel d und schickt sie an den Wähler zurück: w = zd mod n. 3. A wählt einen anderen RSA-Modul nA, dessen Faktorisierung nA = p⋅q sie kennt, benutzt ihren Wahlzettel w als öffentlichen Schlüssel wA = eA auf und berechnet sich dazu den geheimen Schlüssel dA. Dann schreibt sie anonym das Paar (wA, nA) in eine öffentlich einsehbare Datenbank D. 4. Am Tag der Wahl entscheidet sich Alice für die Nummer k des Kandidaten, den sie wählen möchte und schreibt anonym das Paar (wA, kdA) in die Datenbank D. a) Der Wahlleiter W hat d = 59 und n = 187 veröffentlicht. Faktorisieren Sie 187 und prüfen Sie, ob 11 oder 19 der geheime Schlüssel ist. b) Alice schickt die 6. Fibonacci-Zahl an W. Berechnen Sie mit dem Taschenrechner, welche Zahl wA Alice zurück erhält. c) Alice will ihren Wahlzettel wA gegenüber dem Wahlleiter anonymisieren und erzeugt für sich die Zufallszahlen r und s mit r⋅s mod n = 1. (n = 187 ist der Modul des Wahlleiters.) Statt der Fibonacci-Zahl z schickt sie z⋅re an den Wahlleiter und erhält w' zurück. Zeige, dass sie daraus den Wahlzettel w errechnen kann. (Beispiel: r = 10, s = 131) d) Stelle das Verfahren graphisch dar − allgemein und mit den obigen Zahlen. e) Nehmen Sie zu dem obigen Verfahren kritisch Stellung und ♦ erläutern Sie, wie die Wahl ausgewertet werden kann (Stimmauszählung). ♦ Woran erkennt man, dass ein Wahlzettel w gültig ist? ♦ Wie ist sicher gestellt, dass jeder nur einmal wählt hat und ♦ dass jeder, der gewählt hat, auch dazu berechtigt war? f) Jeder Bürger habe eine geheime Identifikationsnummer im Rechner gespeichert. Wie könnte damit das Wahlverfahren verbessert werden? g) In einer Reihung int[] wahl mit m Elementen seien die dekodierten Wahlen gespeichert. Schreiben Sie eine Methode, die in ergebnis[k] die Stimmen des k-ten Kandidaten und in ergebnis[0] die Anzahl der abgegebenen Stimmen liefert. TILL 2008 -25- a phi(11×17) = 160; Überprüfung des Schlüssels 1 = -7×160+19×59 →19 5 b 819 mod 187 = 172 3 c {Man muss mit rd verschleiern: (rd)e mod n = r und r×s mod n = 1 } War offenbar zu schwer oder zu neu. d Graphische Darstellung des Wahlverfahrens 5 e kritische Beurteilung (Verfahren ist unsicher/ Der Wahlleiter müsste einiges kontrollieren) 5 f Erläuterung zur Sicherheit 1 g Methode zur Wahlauswertung 5/24 Literatur Bartholomé, A.; Rung, J.; Kern, H.: Zahlentheorie für Einsteiger, Vieweg 2. Aufl.1996 Beutelspacher, A.; Schwenk, J.; Wolfenstetter, K.-D.: Moderne Verfahren der Kryptographie. Wiesbaden: Vieweg, 1. Aufl. 1995. Beutelspacher, Neumann, Schwarzpaul: Kryptografie in Theorie und Praxis, Vieweg 2005 Schneier, B.: Angewandte Kryptographie, Addison-Wesley, 1. Aufl.1996 Seiffert, M.: Verschlüsselungsmethoden, Teil 2. In: LOG IN 3/1994 S.34f Voß, H.: Praktische Kryptologie mit Java, Libri Books on Demand, 2001 (auch Franzis 2006)