UNSAFE - Unsafe Not Senseful Algorithm For Encryption

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Freitag 24. Oktober 2008, 16:38

So, mein erstes Programm ist endlich fertig! Es "verschlüsselt" und "entschlüsselt" Strings oder auch ganze Dateien. Die Ausgabe kann entweder stdout sein (Standard) oder eine andere Datei. Es wird nicht wirklich was verschlüsselt; die Zeichen werden einfach nur ihrem zugehörigen Wert aus der ASCII-Tabelle zugeordnet (bzw. umgekehrt, wenn entschlüsselt wird). UNSAFE wird über die Kommandozeile bedient (in der README-Datei sind ein paar Beispiele zu finden).

Der komplette Code ist hier zu sehen: http://paste.pocoo.org/show/88985/

UNSAFE kann hier heruntergeladen werden: http://www.zshare.net/download/503490849a6ed2f2/

PS: Ja, ich bin stolz auf das rekursive Akronym :wink:


Edit: 2 Sachen noch:
1. die Bash gibt eine Fehlermeldung zurück, wenn ein String mit mindestens einem Ausrufezeichen ent- oder verschlüsselt werden soll. (Wie kann ich das verhindern?)
2. unter TODO im Docstring von der Klasse Code kann man sehen, was ich noch vorhab: optionale Pipe-Unterstützung anbieten, damit der Input auch anders angegeben werden kann. Mach ich das am besten mit subprocess? Wie ich das gesehen hab, kann man damit nur neue prozesse mit einer Pipe erstellen, aber nicht die Pipe aus dem Programm lesen.
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

Freitag 24. Oktober 2008, 17:26

Code ist aber ein ziemlich schlechter Klassenname. Und obs da ueberhaupt Klassen braucht, bin ich mir net so sicher.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Freitag 24. Oktober 2008, 17:36

Das mit dem Klassennamen hab ich mir auch schon gedacht, ich werde "Text" nehmen, ist passender. Ich benutze da deshalb Klassen, weil bei meinem Script Objekte (die Texte) auf Methoden (entschlüsseln/verschlüsseln) abgebildet werden. Würdest du es besser finden, wenn ich zwei Funktionen hätte, die "encrypt_text" und "decrypt_text" heißen würden?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Freitag 24. Oktober 2008, 17:48

jap.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Freitag 24. Oktober 2008, 18:17

1. die Bash gibt eine Fehlermeldung zurück, wenn ein String mit mindestens einem Ausrufezeichen ent- oder verschlüsselt werden soll. (Wie kann ich das verhindern?)
Das ist das "Rufe Befehl mit Nummer xy" Feature der Bash. ! und !! sind so ziemlich die einzigen Zeichen, die ich nicht per \ escapen konnte, deswegen halte ich die Umsetzung für etwas fragwürdig. Hatte aber noch keinen Erfolg mir in der Richtung ein paar Infos zusammenzusuchen, und rechne eigentlich nicht damit, das das ungewollt ist.

Zum Code:

Neben lstring gibt es rstring, neben startswith gibt es endswith.

Die " " und "-" würd ich in Klassen/Modul variablen packen, sonst fällt das bei mir unter "magic numbering", nur mit Strings ;)

Die Verwendung einer Klasse ist imho auch fragwürdig, die würde schliesslich einen "Codierer" darstellen, der ja im Grunde das Modul selbst schon ist, würde man die encrypt und decrypt Methoden als Funktionen definieren. Also eine unnötige Abstraktionsschicht.
BlackJack

Freitag 24. Oktober 2008, 21:15

@derdon: Du rufst `get_opt()` zweimal auf.

Die Klasse ist unnötig kompliziert, wie ja schon von Anderen erwähnt wurde.

Bibliotheken und insbesondere `__init__()`\s sollten nicht mit `sys.exit()` das Programm beenden. Das verhindert, dass man die Bibliothek oder Klasse gut wiederverwenden kann. Vielleicht möchte man im Fehlerfall etwas anderes machen als das Programm ab zu brechen.

Die Methoden sind IMHO zu komplex und machen zu viel. Die Ganze Sache mit den Dateien könnte man auch ausserhalb erledigen und die Datei-Objekte von aussen als Argumente übergeben. Und als Default-Wert solltest Du auch direkt die Standardein- und -ausgabe verwenden und nicht `None`, dann kann man sich eine Überprüfung auf `None` sparen, weil man sicher ist, dass man ein Dateiobjekt vor sich hat.

Die Funktionen sollte man am besten so schreiben, das sie mit beliebigen "iterables" funktionieren. Dann kann man mit der gleichen Funktion eine Datei oder aber auch eine Liste mit Zeilen (de)kodieren.

Die Mehrfachbedeutung vom `input`-Argument von `__init__()` ist ungünstig. Wenn man Pech hat wird eine Datei verschlüsselt wenn man eigentlich eine Zeichenkette verschlüsseln wollte, nur weil es zufällig eine Datei mit dem entsprechenden Namen gibt.

Die `replace()`\s in den (De)Kodierungsfunktionen sind unsauber. Man sollte nicht Zeichenketten erzeugen bei denen man am Ende wieder Sachen entfernen muss, wenn man das auch so schreiben kann, dass der "junk" da gar nicht erst in der Zeichenkette landet. Man könnte das ganze auf kleine Probleme runter brechen. Eine Funktion um Zeilen (beliebiges "iterable") zu (de)kodieren, die sich auf eine Funktion abstützt, die eine Zeile (de)kodiert, die sich wiederrum auf eine Funktion abstützt, die ein einzelnes Wort (de)kodiert.

Bei Kommandozeilen-APIs unterscheidet man zwischen Optionen und Argumenten. Optionen sollten optional sein, so etwas wie eine obligatorische Option ist ein Widerspruch. Man *muss* dem Programm sagen, ob man ver- oder entschlüsseln möchte, das ist also keine Option. Im vorliegenden Quelltext trifft das auch auf `-i` zu, aber das sollte nicht obligatorisch sein, sondern die Standardeingabe als Vorbelegung haben.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Freitag 24. Oktober 2008, 23:44

Man muss ihm (ihr?) aber lassen, dass er (sie?) schönen, sauberen Code schreibt.
Hast du Python nach einem Tutorial gelernt? Wen ja, nach welchem?
BlackJack

Samstag 25. Oktober 2008, 00:53

Mit schönem, sauberen Code meinst Du jetzt aber nur die äussere Form!?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Samstag 25. Oktober 2008, 10:37

BlackJack hat geschrieben:Mit schönem, sauberen Code meinst Du jetzt aber nur die äussere Form!?
Ja. Schön zu lesen und so.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Samstag 25. Oktober 2008, 11:49

Dauerbaustelle hat geschrieben:Hast du Python nach einem Tutorial gelernt? Wen ja, nach welchem?
Hab das offizielle Tut gelesen und lese das Buch "Core Python Programming". Und: ich bin ein ER und keine SIE (ich heiße ja auch derdon und nicht diedon :wink: )
Antworten