Verschlüsselung

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
bushman
User
Beiträge: 8
Registriert: Donnerstag 27. Dezember 2007, 14:14
Kontaktdaten:

Hallo,
anlässlich meines Abitur, muss ich eine Präsentation im Fach Informatik abhalten. Mein Thema bezieht sich auf Verschlüssleung. Dazu habe ich selber ein bissl was versucht zu programmieren.Dies soll eine Anlehnung an einer One-Time-Verschlüsselung sein. Vorab sollte gesagt werden, dass dies meine erste Veröffentlichung von Skriptexten ist und man mir bitte um etwas Nachsicht bitte sollte.:)
Ihc habe Python als Sprache ausgewählt, da wir im 2. Semster in Informatik uns mit Python beschäftigt haben. Daher habe ich zwar ein bissl Ahnung aber ich denke einige Punkte hätte man sicher einfacher und schneller machen können.
Der Grund wieso ich, dass poste ist, dass ich gern ein paar kritische Stimmen hören würde.

Dabei handelt sich einmal um die Schlüsselerzeugung, Verschlüsselung und die anschließende
Entschlüsselung

Verbesserungsvorschläge können wahrscheinlich nur bedingt eingebracht werden. Die müsste ich nochmal mit meinem Lehrer besprechen, aber darum geht es eigentlich nicht. Wichtig wäre mir eure Meinungen:)

Bis Bald

Olli

Edit by Gerold: URLs angepasst
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi!
Ich habs mir jetzt nur kurz angeguckt. Was mir aufgefallen ist:
  • es gibt im Modul string Konstanten wzB. "string.ascii_lowercase". Damit brauchst du das nicht per Hand in den Code schreiben.
  • es gibt die Funktion "range", mit der kannst du deine Zahlenliste erstellen.
  • warum hast du das in 3 Dateien getrennt? Die sind alle recht kurz und auch recht ähnlich. Du solltest das in eine Datei schreiben und in Funktionen aufteilen, sodass du doppelt genutzte Stellen nur einmal hinschreiben musst.
BlackJack

@bushman: Vorsichtig ausgedrückt: Ziemlich gruselig. Copy und Paste Quelltext, die drei Dateien sind ja nahezu identisch. Alles einfach linear runtergeschrieben, statt in Funktionen aufgeteilt. Teilweise abenteuerliche Namen wie zum Beispiel `schuessel` für eine Laufvariable deren Wert nie verwendet wird. Oder ein recht kurzes, nichtssagendes `f`.

Algorithmisch gesehen ist es auch grausam. Immer wieder linear in zwei Listen nach Elementen suchen und Texte bearbeiten, indem immer das erste Element per ``pop(0)`` entfernt wird, ist schon ziemlich heftig. Das skaliert *überhaupt nicht*.

Das Programm aus Benutzersicht: Was passiert, wenn der Benutzer an den verschiedenen Stellen etwas anderes als 'ja' oder 'nein' eingibt? Warum darf ein Schlüssel nicht länger sein als der Klar- oder Geheimtext? Ist ja kein Problem überschüssige Schlüsselbytes einfach zu ignorieren. Und Schlüssel, die genau so lang sind wie der Text, vom Benutzer zu verlangen ist auch recht heftig.

Die Schlüsselerzeugung sollte eher eine Schlüsselsammlung mit schön langen Zufallsbytes erzeugen. Am besten nicht als Zeilen, sondern eine grösse Binärdatei und der Schlüssel, den der Benutzer dann eingeben muss, ist ein Offset in diese Datei. Dann erzeugt man einmal so eine Datei, mit sagen wir mal 600MB Grösse, brennt die auf CD und lässt diese dem Kommunikationspartner über einen sicheren Kanal zu kommen.
bushman
User
Beiträge: 8
Registriert: Donnerstag 27. Dezember 2007, 14:14
Kontaktdaten:

Danke schonmal für die Kommentare.

Da ist sicherlich noch viel Verbesserungswürdig.
Einige Variabeln hatte ich wohl eingesetzt um dann später festzustellen, dass diese nicht benötigt werden.
Die Varibalen müssten wahrschienlich alle soweiso nochmal komplett überarbeitet werden.
1. auf ihren Sinn und 2. auf den Namen.

Das Hauptproblem ist wohl, dass ich vornehmtlich aus mein Schulwissen zurückgegriffen hab und mich nicht weiter informiert habe. Denn mit Funktionen haben wir überhaupt nicht gearbeitet... sondern besonders am Ende nur mit Listen.

Außerdem haben wir uns nie mit Binärzahlen etc weiterauseinander gesetzt. Darum fehlt mir dafür auch das nötige Wissen miteinzubringen.

Die Dateien wollte ich trennen um die drei Schritte genauer abzugrenzen.

Bei den Funktionen werde ich mich einlesen. Vielleicht finde ich dann andere Möglichkeiten.

Nur der Klar- bzw. Geheimtext sollte nicht länger als der Schlüssel sein und nicht umgekehrt. Das muss ich wohl nochmal überprüfen, ob ich da was vertauscht habe^^
Weitere Kommentare sind erwünscht.
DarXun
User
Beiträge: 21
Registriert: Montag 21. Januar 2008, 00:44

-Die Caesar-Verschlüsselung wurde hier im Forum schon behandelt. >> Klick mich <<

Das solltest du dir mal durchlesen.
Achja und Funktionen sind wirklich sehr wichtig...
Wundert mich schon, dass du die noch nicht hattest.
Ich bin selbst erst in der 10. Klasse und wir haben vor kurzem mit Python angefangen, aber Funktionen kamen bei uns schon vor Listen.

Ansonsten kann ich mich nur BlackJack anschließen ;)


~DarX
bushman
User
Beiträge: 8
Registriert: Donnerstag 27. Dezember 2007, 14:14
Kontaktdaten:

Das Problem ist, dass man bei uns in der Mittelstufe entweder Informatik oder eine dritte Fremdsprache wählen musste. Und somit habe ich erst mit der 12 Klasse im Grundkurs damit angefangen.... :(
bushman
User
Beiträge: 8
Registriert: Donnerstag 27. Dezember 2007, 14:14
Kontaktdaten:

Ich hab mich jetzt ein bissl mit Funkitonen auseinander gesetzt und die Zahlenerzeugung etwas geändert. Allerdings habe ich das Prinzip gleich gelassen, wie gesagt für ne Binär-Datei fehlt mir das Wissen.
Aber die Varibalen sollten eingentlich alle besser benannt sein und es es deutlich übersichtlicher^^
link

Achso wenn einge Funktionen noch überflüssig erscheinen so liegt es daran, dass in die Datei noch Verschlüsselung und Entschlüsselung kommen.
Die ganzen Anfragen sind auch erstmal rausgeschmießen^^
BlackJack

Funktionen sind das aber nur syntaktisch. Bitte alle ``global``\s entfernen und *echte* Funktionen schreiben. Werte betreten Funktionen in der Regel als Argumente und verlassen sie als Rückgabewerte.

Die `zahlen` sind überflüssig. In `alp` (schlechter Name) sind Zeichen mehrfach vorhanden. Und es wäre kürzer wenn man die Zeichen als Zeichenkette hin schreibt, am besten mit Konstanten aus dem `string`-Modul und dann mit `list()` in eine Liste umwandelt. Weniger Tipparbeit und etwas übersichtlicher. Falls die Umwandlung in eine Liste überhaupt nötig ist!?

Code: Alles auswählen

ALPHABET = string.ascii_letters + ' ,.!?'
`ZBZ()` und `ZZB()` sind schlechte Namen. Wenn man die ordentlich benennt, kann man sich den erklärenden Kommentar sparen was die Namen bedeuten. Beide Funktionen gibt's im Grunde schon auf dem Alphabet-Objekt als Methoden:

Code: Alles auswählen

buchstabe_nach_zahl = ALPHABET.index
zahl_nach_buchstabe = ALPHABET.__getitem__
`dateiname` wird nicht an einen Datei*namen* sondern an ein Datei-Objekt gebunden. Und die Datei wird in einer anderen Funktion geschlossen als in der in der sie geöffnet wird. Öffnen und schliessen sollten in *einer* Funktion stehen, und zwar in `speichern()` und die sollte wirklich den Dateinamen als Argument bekommen.
bushman
User
Beiträge: 8
Registriert: Donnerstag 27. Dezember 2007, 14:14
Kontaktdaten:

Ahoi,
ich habe mir die Kritik zu Herzen genommne und ein bissl was verbessert.
Wobei ich die Unterscheidung zwischen großen und kleinen Buchstaben gut finde. Denn mit nur kleinen Buchstabe wäre der SChlüsselraum auf 26 + Sonderzeichen begrenzt. So ist der Schlüsselruam auf 56 Zeichen + Sonderzeichen angewachsen, wobei eben es für den kleine und den großen Buchstaben des jweilligen Buchstabes unterschiedliche Schlüssel gibt. Der Name könnte sicher geändert werden, aber so dramatisch ist es auch nicht, wie ich finde.
Allerdings fande ich den Einwand bezüglich der Funktionen richtig und wichtig.
Ich habe mich rangesetzt und alles nochmla verbessert und die möglichen eingaben hinzugefügt, wobei diese gefallen mir noch nicht 100%. Das ist einfach zu lang und machen etwa die Hälfte des gesamten Codes aus...
Aber da diese nicht wichtig sind, können die ruhig etwas vernachlässigt werden.

Code

Aber besonders an Blackjack vielen Dank!
Ich finde das einfach nur Klasse! :!:


Olli
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du listest noch immer jeden Buchstaben einzeln auf.

Benutze nicht "input", sondern "int(raw_input(...))", denn "input" tut noch viel mehr als du denkst (Forensuche hat genug Themen dazu).

Die tausenden von Zahlen in deinem Quellcode solltest du noch in Konstanten auslagern, oder ggf. durch "len(...)" ersetzen.

Du musst die 0 nicht als start bei "range" angeben, dass wird implizit gemacht.

Schau dir noch mal PEP8 an (Styleguide). Weiter bist du mit der Form deines Quelltextes etwas inkonsistent was das setzen von Leerzeichen angeht. Und zur Übersicht schadet die ein oder andere Leerzeile nicht ;-)

Guck dir mal an, was "JA".lower() und "Ja".lower() machen.

Die Funktion "eingabe" ist viel zu lang.

Code auf Modul-Ebene ausführen ist etwas ungünstig (alles hinter der Funktion "eingabe"). Das solltest du lieber hinter einem if __name__ == "__main__" verstecken. Dann kann mein dein Modul auch importieren ohne, dass das Programm gleich ausgeführt wird.

Ach ja, wir wollen ja auch nicht das positive vergessen: Sieht ingesamt schon viel besser aus als die alte Version.
Antworten