Arbeit über Kryptographie

Hallo allerseits
Ich muss/darf von der Schule aus eine Arbeit im Thema Kryptographie schreiben. Ich habe mir dazu einige Gedanken gemacht, habe mit Kollegen und Lehrer gesprochen usw. Wir kamen auf die Idee die Arbeit z.B. über die Verschlüsslung RSA zu machen und Teil der Arbeit wäre ein Programm zu schreiben, dass einen Text einliest, diesen mit dem Entsprechenden Algorithmus verschlüsselt, unter umständen den verschlüsselten Code ausgibt und das ganze wieder entschlüsselt.
Jedoch bin ich noch nicht 100% ig sicher, ob ich genau darüber schreiben will oder soetwas programmieren will.
Meine Fragen nun:
- Habt ihr andere Vorschläge für die Arbeit im Thema Kryptographie?
- Habt ihr Vorschläge für ein Programm in diesem Themenbereich?


Liebe Grüsse Daniel
 
Hallo,
RSA ist eigentlich recht viel (höhere) Mathematik, was in der Schule eher schlecht zu behandeln ist, da dort einfach elementare Begriffe wie z.B. endliche Gruppen fehlen.
Man kann es zwar machen, besonders schön ist es nicht.

Ebenso finde ich das Thema Crypto für die Schule eigentlich blöde, da es sehr ausgelutscht ist und man nicht viel 'tolles' machen kann.

Da ihr ein Programm schreiben sollt (ich kenn aber dein Know How nicht):
Wie wärs, wenn man einen geschützten Netzwerkstream schreibt, der sich so leicht wie ein normaler Networkstream nutzen lässt?

Nach dem Verbindungsaufbau einigt man sich mittels Diffie-Hellman (noch komplizierter von der Mathematik als RSA) auf einen Schlüssel, den man dann für ein symmetrischen Algorithmus, z.B. AES, verwendet, um die Daten die gesendet und empfangen werden zu verschlüsseln.


Ein gutes Tool ist CrypTool, unbedingt mal angucken.
 
Also erstmal: Kryptographie ist ein verdammt großes Thema :)
Willst Du historische Verschlüsselungsmethoden (Caesar-Chiffre etc.) oder aktuelle computergestützte Chiffren behandeln?
Soll deine Arbeit einfach ein Programm sein, oder ein Text, der auch die Hintergründe/historische Entwicklung der Kryptographie beleuchtet?
Falls du ihn noch gelesen hast, ist sicherlich auch der Wikipediaartikel zur Kryptographie geeignet, Ideen zu liefern.
Sehr zu empfehlen ist außerdem dieses Buch von Simon Singh, welches auch einen sehr schönen Überblick über die Kryptographie liefert.
 
Danke für die schnellen Antworten.
Ich hab mir das "CrypTool" gerade runtergeladen und bin nun ein bisschen am herumprobieren und daran schnuppern=)
Dann werd ich mir das mit dem RSA noch mal überlegen (werd wohl die Mathematik dahinter mal genauer anschauen und wenn sie zu unbekannt ist aufgeben).
@Elderan: Kannst du deine Idee mit dem Networkstream noch etwas erläutern? Ich weiss nich genau was du mit einem "einen Netzwerkstream schreiben" meinst?
Man würde dann Daten verschlüsseln, im Netzwerk rumschicken, und wieder entschlüsseln, das einfach mit einer symmetrischen Verschlüsselungsmethode?
Und weshalb denkst du ist Kryptographie ein ungeeignetes Thema? Wegen der Mathematik? Oder mangels praktischer Arbeit?

@Heinzelotto: Die Arbeit sollte wenn möglich möglichst praktische Arbeit sein (damit es auch mir mehr Spass macht -> Programmieren zählt natürlich dazu). Natürlich wird es einen schriftlichen und theoretischen Teil geben in dem ich je nach Thema z.B. den Algorithmus einer Verschlüsselungsmethode erläutere oder je nach dem auch etwas zur Geschichte von der Kryptographie schreibe.
Danke für den Buchtipp!

Noch eine allgemeine Frage... Gibts zum Thema Kryptographie überhaupt etwas anderes zu Programmieren ausser einer Ver- und Entschlüsselung?

Falls ihr auch Ideen habt zu diesem Thema zu einer praktischen Arbeit neben dem Programmieren oder sogar ab vom PC höre ich natürlich auch sehr gerne zu.
 
Hallo,
naja wie weit kennst du dich denn mit der Programmierung aus. Sind dir Sockets und Streams ein begriff?
Wenn nein: Evt. lieber sein lassen.
Wenn ja: Normalerweise werden die Daten über ein Socket unverschlüsselt gesendet. Nun sollst du einen entsprechenden Stream schreiben, der beim schreiben von Daten (d.h. vom senden von Daten) diese on-the-fly verschlüsselt und beim lesen von Daten (d.h. vom Empfangen von Daten) diese on-the-fly entschlüsselt.

Ich finde Kryptographie, zumindest das was man in der Schule so macht, relativ langweilig, zumindest in 99% der Fälle. Das meist nichts anderes als den Wikipedia Artikel (o.ä.) in verkürtzer Form wiederzugeben und evt. sich irgendwo eine Beispielimplementierung zu klauen und vorzuführen.
Ebenso ist es zumeist ein recht ausgelutschtes Thema, denn Generationen von Schüler schreiben jedes Jahr über Kryptographie, und meist immer den gleichen 'Mist'. Wo ist da noch der Anspruch?


Und Kryptographie ist viel mehr als nur Ver- und Entschlüsseln, was im Rahmen der Schule aber oft vergessen wird.

Bei dem genannten verschlüsselten Netzwerkstream (ist eine Art SSL-Light) kann man schön diverse Techniken nutzen.
Man hat ein Schlüsselaustauschverfahren (Diifie-Hellman), was nichts mit Ver- und Entschlüsseln zu tun hat, dann hat man eine symmetrische Verschlüsselung und man muss sich noch Gedanken machen, welche Betriebsart sinnvoll ist für dieses on-the-fly ver- und entschlüsseln.
Ebenso könnte man noch ein kryptographisches Protokoll entwerfen, um beispielsweise einen Initialisierungswert auszutauschen etc.
 
Also von Sockets hab ich noch nie gehört, hab es vorhin jedoch gegoogelt und jetzt ists mir eigentlich oberflächlich ziemlich klar. Von Streams hab ich schon gehört.

Jedoch damit Programmiert habe ich noch nie... Doch die Arbeit ist auch dazu gedacht etwas neues zu lernen, sich ein wenig zu spezifizieren und auf etwas zu arbeiten, dass einem gefällt und interessiert (es muss schlussendlich auch nicht "real brauchbar" sein). Deshalb denke ich macht es nichts wenn ich das noch erlernen muss (ausser du hast die Erfahrung gemacht, dass Sockets Programmierung extrem schwierig/kompliziert ist?).

Noch eine Frage zu deinem Vorschlag: Es wäre also möglich für die Verschlüsselung einer Datei auch eine einfachere symmetrische Methode wie z.B. "Cipher Block Chaining Mode" zu gebrauchen?

Noch eine weitere Frage zum on-the-fly Verschlüsseln. Was ist das genau? Wird da die Verschlüsselung mit dem Socket vorgenommen oder wird die Nachricht troztdem zuerst verschlüsselt und dann über den Socket verschickt?
 
Hallo,
naja je nach Programmiersprache ist Socket/NetworkStream Programmierung für den Arsch oder extrem einfach (z.B. bei C# ist es sehr angenehm).


Also ein NetworkStream hat i.d.R., wie jeder andere Stream auch, eine Methode read() und write(byte[] value).

Mit write sende ich Daten über das Netzwerk, mit read kann ich Daten vom Netzwerk lesen.
On-the-fly heißt nun, du machst das ganze Transparent für den Programmierer.
Wenn er write() aufruft, werden die Daten nicht nur übers Netzwerk gesendet, sondern zuvor auch verschlüsselt (d.h. write verschlüsselt die Daten erst und sendet sie dann).
Bei read() werden die ankommenden Daten beim/vom Socket gelesen und entschlüsselt, so dass der Programmierer den ursprünglichen Text hatte (d.h. read liest die Daten die ankommen, entschlüsselt sie und gibt diese zurück).

Der Programmierer soll nichts davon mitbekommen, dass die Daten ver- und wieder entschlüsselt werden. Für ihn soll es so aussehen, als sei es ein ganz normaler Stream.

Da du ja mit einem Stream arbeitest, wäre eine Streamcipher zu empfehlen. Man könnte RC4 nehmen, was aber schwierig in der Handhabung ist.
Besser ist AES o.ä. in einem Streamcipher Mode zu verwenden, beispielsweise im Counter-Mode.


Je nach Programmiersprache ist solch ein geschützter NetworkStream mal mehr mal weniger aufwendig.
Bei C# reicht es schon, einfach vom NetworkStream zu erben, beim Verbindungsaufbau einen Schlüssel auszutauschen (Diffie-Hellman) und dann read() und write() zu überschreiben, dass die Daten ver-/entschlüsselt werden. Danach bzw. davor (bei read) kann man weiter die Methode der Elternklasse (NetworkStream) verwenden.
 
Also ich werde das ganze in Java programmieren. Weisst du wies damit steht (also auf dem Inet hats ja ziemlich Anleitungen zur Socket-Programmierung)?

Also ich habe jetzt etwas übers AES gelesen u.a. auf Wikipedia, und ich verstehe eigentlich was während den schritten geschieht:
Substitution, ShiftRow, MixColumn, KeyAddition... Bis auf die Schlüsselexpansion; wird da einfach der Schlüssel in Blöcke unterteilt? Sind die Blöcke die Zeilen der Tabelle (also 128 oder 256 Bits)?

Ich habe einfach keine Ahnung, weshalb man die Verschlüsselung genau in dieser Reihenfolge macht, weshalb man z.B. "MixColumn" macht usw.?

Und was ist Counter-Mode(Ist das einfach eine Art eine Blockverschlüsselung als Streamcipher-Verschlüsselung "laufen zu lassen")?

Gäbe es einfachere Streamcipherverschlüsselungen?
Die Übertragung schlussendlich muss nicht sicher sein, es geht eher darum mal auszuprobieren, etwas zu Stande zu bringen und darüber ne Arbeit zu schreiben.

(Also es ist einfach so, dass als ich die Verschlüsselungstechnik des AES las, kam es mir ziemlich kompliziert vor zum programmieren. Deshalb dachte ich es gäbe vielleicht eine einfachere Methode. Oder hast du die Erfahrung, dass es dann zum Programmieren nicht allzu kompliziert ist? (Also ich habe gerade eine einfache XOR Verschlüsselung programmiert und das war nicht allzu kompliziert, aber ich kann halt mangels Erfahrung nicht gut abschätzen wie kompliziert AES wirklich ist).)
 
Hallo,
naja du musst selber beurteilen, wie viel Zeit du hast bzw. investieren möchtest. Sich in das Thema einzuarbeitet dauert schon etwas, das ist nicht von heute auf morgen erledigt.

Und du solltest (noch) nicht hinterfragen, warum ein Algorithmus etwas genau in dieser Reihnfolge oder genau diese Operation macht. Dies zu verstehen ist extrem schwierig und man braucht unheimlich viel Know How in der Kryptoanalyse (das Analysieren von Algorithmen), welches man erst nach Jahren erhalten kann.

Wie AES o.ä. aufgebaut ist sollte man so akzeptieren. Da haben sich viele Leute sehr lange Gedanken gemacht.


Also AES ist eigentlich relativ leicht zu erklären, schau dir mal ein paar Weblinks von Wikipedia an.
Manche Beschreibungen beschreiben es sehr anschaulich, andere wiederum beschreiben es sehr mathematisch, welches deutlich über Schulniveu hinausgeht.
Aber diese hohe Mathematik braucht man eigentlich nicht.

Die Grundlage von AES ist eigentlich ein zwei dimensionales Byte-Array. Da du 16 Byte Blöcke ergibt sich also ein 4x4 Byte Array. Dieses kannst du auch so direkt in Java umsetzen.
Auf dieses zwei dimensionale Byte Array werden nun verschiedene Operationen (ShiftRow, MixColumn etc.) angewendet. Mal werden alle Werte in dem Byte Array durch andere ersetzt (in der Art 00 => AF, 01 => 1F, ..., FF => 05), mal werden Zeilen/Spalten verschoben etc.

Wenn man diese 2-dim Byte Array erstmal hat, ist der Rest relativ leicht, sofern man eine halbwegs verständliche Anleitung findet.


Ansonsten kann man auch noch XTEA (Blockchiffre) oder RC4 (Stromchiffre) verwenden.
Diese sind in der Implementierung wirklich super schlank und man kommt mit sehr wenigen Zeilen hin.

Der Counter Mode ist eigentlich auch ganz einfach.
Die beiden Parteien müssen sich auf einen Key einigen und dann einen (nicht geheimen) Startwert aushandeln, der aber nur 1 mal verwendet werden sollten.
Dazu könnten beide Parteien z.B. eine 128 Bit lange Zufallszahl erzeugen und dem anderen senden. Der Startwert ist dann die XOR-Verknüpfung beider Startwerte.

Verschlüsseln geht dann, indem man den Startwert verschlüsselt. Das Ergebnis nutzt man dann als Streamchipher. Man bekommt ja einen 128 Bit Wert als Geheimtext, dieser Geheimtext XOR Klartext stellt dann den Geheimtext dar den man sendet.
Beim Entschlüsseln das gleiche.
Erst den Startwert verschlüsseln, dann die ankommenden Daten XOR Verschlüsselter_Startwert.

Danach erhöht man den Startwert um 1.


Du solltest aber bedenken, dass du zwei Ströme zwischen zwei Clients hast. Einmal von Client A nach Client B und einmal von Client B nach Client A.
Dort ein und den selben Wert für den Counter zu haben geht nicht. Man muss also zwei (unterschiedliche) Counter haben.


Ansonsten kenn ich mich mit Java nicht so aus, aber dort es kein Problem sein einen eigenen gesicherten Netzwerkstream zu schreiben.
Einfach von NetworkStream (oder wie auch immer es in Java heißt) erben und die entsprechenden Methoden überschreiben.
 
Zurück
Oben