Andreas, Claudia und Isabel: Implementation des Triple-DES Algorithmus.
Tim: Implementation der Methoden encrypt und decrypt in der Klasse RSA.
Yves: Implementiere die Signaturmethoden in der Klasse CryptSystem. Wir brauchen jeweils eine Methode zum erzeugen eines MD5-Wertes und eine zum Überprüfen des MD5-Wertes:
String createMD5(String text); boolean checkMD5(String text, String hashwert);Zusätzlich kannst du nochmal durch alle Klassen/Methoden gehen und überprüfen, wo Exceptions, try/catch-Blöcke benötigt werden.
Andreas, Claudia und Isabel: Versucht den Fehler im aktuellen Ver- oder Entschlüsselungsalgorithmus beim DES zu finden. Ich werde mir bis nächste Woche den Code selber anschauen, vielleicht sehe ich irgendwelche Ungereimtheiten.
Tim: Die Methode für den Logarithmus brauchst du nicht zu schreiben, das
haben wir nun durch eine einfache for-Schleife gelöst (siehe RSA.java Methode
createKey). D.h. die Variable $k$ im RSA-Algorithmus wird beim Schlüsselerzeugen
bestimmt und in der Variablen int keyLength abgespeichert.
Du kannst bis nächste Woche versuchen, die Nachricht (String plaintext),
die der Verschlüsselungsmethode encrypt übergeben wird, schon
in geeignete Blöcke einzuteilen. Falls du noch Zeit hast, kannst du auch gerne
den kompletten Verschlüsselungsalgorithmus für RSA implementieren.
Yves: Die checkKey() Methode für den DES-Algorithmus muß noch implementiert werden. Zusätzlich müssen bei der Ver- und Entschlüsselung mögliche Fehler abgefangen werden. Überlege, wo dies überall passieren kann, und wie man mit Hilfe von "try/catch" Blöcken sowie der "throw" Anweisung dies behandeln kann. Z.b. habe ich in der Klasse Caesar die Methode stringToKey mit dem Zusatz throws IndexOutOfBoundsException versehen, damit ein Fehler ausgegeben wird, wenn der übergebene String leer ist.
Andreas, Claudia und Isabel: Arbeitet weiter am DES-Algorithmus.
Yves: Implementiere die Methode checkKey() für den DES-Algorithmus. Für RSA benötigen wir die Methoden ggt und inv mit BigInteger Zahlen. Die Gerüste stehen schon in der Klasse CryptMath, implementiere diese bitte auch zuende.
Tim:
Lies dich in Kapitel 9 im Buchmann ein (RSA-Algorithmus). Beim ver- und entschlüsseln
mit RSA müssen die Nachrichten in geeignete Blöcke aufgeteilt werden. Überlege
dir, wie man das in Java realisiert.
Zusätzlich müssen wir bei Ver- und Entschlüsselung auf die schnelle Exponentation
zurückgreifen. Diese ist im Abschnitt 3.12 des Buches beschrieben. Bitte durchlesen
- und verstehen! :-) Nächste Woche
werden wir versuchen, diesen Algorithmus in die Klasse CryptMath einzubringen.
public byte[] stringToBytes(String p); public String bytesToString(byte[] c);auch schon einmal implementieren.
public boolean checkKey();kannst du in die Kryptoklassen integrieren. Genauso kannst du die Methode checkString(String s) in die Klasse CryptSystem einbauen. Die neuen Versionen dann auf den CVS Server hochladen, damit seine Existenz gerechtfertigt ist :)
Einen CVS Client für Windows findest du hier: WinCVS. Nur, falls du den in Eclipse eingebauten Client nicht benutzen möchtest...
Du kannst dir auch eine checkKey() Methode für den DES-Algorithmus ausdenken. Im Handout von Isabel stehen die Bedingungen für einen gültigen DES-Schlüssel (z.B. 8tes Bit von den ersten 7 abhängig). Dabei solltet ihr euch absprechen, ob der Schlüssel besser in einer (8x8)-Matrix oder in einer (1x64)-Matrix abgespeichert wird. Das hängt davon ab, welche Rechenschritte des Algorithmus durch die eine oder andere Speichermethode einfacher zu implementieren sind.Vielleicht sollte man in der Methode, die einen randomisierten Schlüssel erzeugt, die Schlüssellänge auch zufällig wählen. Das macht die Sache beim Entschlüsseln ohne Schlüsselkenntnis schwieriger. Statt bei Blockchiffren Leerzeichen an den Klartext zu hängen, sollte man zufällig gewählte Characters erzeugen. Wenn man eine verschlüsselte Nachricht erhält, bekommt man als Zusatzinformation die Länge des Klartextes übermittelt, so daß man die letzten überflüssigen Zeichen dann löschen kann. Dafür brauchen wir dann einen Parameter int extra, der die Anzahl dieser letzten Zeichen enthält.
Den Fehler in der Klasse Hill habe ich noch nicht entdeckt, ich suche aber gleich weiter...
UPDATE Gefunden! Die Methode für die Determinantenberechnung in CryptMath hat
für einige Matrizen den falschen Wert ausgespuckt... ist jetzt korrigiert.
Diese Methode muß man vielleicht mal optimieren. Bei einer Schlüssellänge
ab 8-9 Zeichen kommt er bei der Berechnung der Inversen ganz schön ins Schwitzen...
Was auch noch fehlt: Ein Zufallsgenerator für die Klasse Permutation beim Schlüsselerzeugen. Ist im Moment statisch geregelt.
Wenn ihr euch die neuesten Dateien anschaut (Download auf der Hauptseite) fällt euch sicherlich auf, dass ich die Klassen etwas umgestellt habe. Wir hatten uns beim letzten mal auf folgende Struktur geeinigt:
protected int[][] key; protected int keyLength;Eine Variable für den Klar- und Chiffretext existiert nicht mehr, diese werden beim Methodenaufruf mitgegeben. Die zwei Methoden
abstract public String encrypt(String plaintext); abstract public String decrypt(String chiffretext);sind in der Klasse AffineChiffre implementiert und werden von allen abgeleiteten Klassen mitbenutzt (funktioniert soweit auch). Das Prinzip ist jeweils das gleiche. Beim verschlüsseln rechnet man A*v+b und beim entschlüsseln (v-b) * A'.
Die Aufgaben bis Donnerstag werden aufgeteilt:
abstract public boolean checkKey();soll in allen bisher vorhandenen Kryptosystemen implementiert werden. Es wird überprüft, ob der bisher abgespeicherte Schlüssel korrekt ist.
public int[][] getMatrix(); public int[] getVector();extrahieren jeweils die Matrix A und den Vektor b aus dem Schlüssel. Bei den affinen Chiffren, die nicht die Einheitsmatrix benutzen, muß überprüft werden, ob det A teilerfremd zu 96 ist. Mach dir auch noch Gedanken dazu, welche Methoden Exceptions werfen könnten/sollten.
abstract public void stringToKey(String s); abstract public String keyToString();in allen von CryptSystem abgeleiteten Klassen. In Caesar habe ich das schon gemacht. Die Schlüssel werden wie folgt gespeichert:
String key = "pi(1), pi(2), ..., pi(n)"Man hat also einen String bestehend aus n Zahlen, die die Permutation "pi" repräsentieren. Man könnte auch die Permatationsmatrix als ganzes darstellen, dann also so wie bei der nun folgenden Hill-Chiffre.
String key = "a11, a12, ..., a1n;" + "a21, a22, ..., a2n;" + "..." + "an1, an2, ..., ann;";D.h. Spalteneinträge werden durch Komma getrennt, Zeilen durch ein Semikolon.
Viel Spass und bis Donnerstag!
Die restlichen drei affinen Verfahren sollen zuende implementiert werden.
Die Klasse Mathe ist bis auf die Methode zum invertieren von Matrizen
(fürs Erste) komplett.
Zu den erlaubten Characters kommt noch der Zeilenumbruch hinzu
(ASCII Wert 10). Insgesamt sind nun 96 Zeichen erlaubt, ihr
müßt die Methoden entsprechend verändern (update: habe
ich schon gemacht). Einer von euch kann bitte die Dokumentation
im Source Code anpassen. Da stehen im Moment noch viele alte
Sachen drin, die nicht mehr aktuell sind.
Die aktuellsten Versionen der .java Dateien kann man unten von der
Seite herunterladen. Ich habe den Source Code schon an die 96
Zeichen angepasst und einen Fehler beim Entschlüsseln behoben.
Zugegebenermaßen nicht sehr effizient, aber darüber können
wir diese Woche noch sprechen...
Die Klasse Caesar soll korrekt zuende implementiert werden.
Danach kann man sich an den übrigen drei affin linearen
Verschlüsselungsverfahren versuchen. Die mathematischen Methoden
zur Bestimmung von ggT, Inversem, etc. sollten in der Klasse Mathe (s.u.)
untergebracht sein. Das Gerüst für diese Klasse habe
ich schon einmal geschrieben. Die Algorithmen hierfür kann man
in Kapitel 2-4 im Buchmann nachschlagen.
Vielleicht könnt ihr die Arbeit aufteilen, indem eine Gruppe von euch
die mathematischen Methoden implementiert und die andere die
kryptographischen Protokolle.
Implementierung der Methoden der Klasse Kryptosystem
und der aus Kryptosystem abgeleiteten Klasse Caesar.
In der main-Methode der Klasse Caesar soll eine
Ver- und Entschluesselung durchgeführt werden.
Am besten auch direkt javadoc-konform alles dokumentieren :)
Wie das geht steht auf der Hauptseite beschrieben.
Blatt 1 (habe ich auch schon ausgeteilt)