Kryptografie mit Java

Werbung
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)
Herunterladen