Caesar-Verschlüsselung

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Benutzeravatar
Klapperschlange
User
Beiträge: 6
Registriert: Freitag 4. Januar 2008, 15:55
Kontaktdaten:

Ja für die Facharbeit mach ichs auch auf jeden Fall so wie ich mir das zuerst gedacht habe und wie gut ich das hinbekomme; hab jetzt nur noch die "try...expect"-Blöcke eingebaut und ein bisschen was an den Namen geändert.

Und trotz noch wenig Programmiererfahrung ist doch gut im Hinterkopf zu behalten, dass Python sowas kann - irgendwann brauchts man ja bestimmt :wink:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Klapperschlange hat geschrieben:Aber danke für die Erläuterung der Funktionsweise des "Erbens" - gibts das nur bei Python oder auch in anderen Programmiersprachen? Weil das ist mal eine nützliche Sache.
Ja, gibt es. Das ist eben Objektorientierte Programmierung, aber - und nun kommt das obligatorische aber - das kann von Programmiersprache zu Programmiersprache ganz unterschiedlich gelöst sein.

In Python kann man erst seit 2.2(.1?) von eingebauten Objekten wie ``file``, ``list``, ``dict`` etc. erben. In anderen Sprachen geht das zum Beispiel gar nicht, in noch anderen Sprachen sind noch tiefschürfendere Dinge erlaubt. OOP ist eigentlich ein Konzept, nicht eine Implementierung. Vielen Leuten wird beigebracht, dass Java das "richtige OOP" ist. Um es kurz zu fassen: Javas OOP ist nur eines der Möglichen Arten von OOP, Python und Ruby sind viel näher am "original OOP" von Smalltalk dran (du darfst gerne einige Begriffe in Wikipedia eintippen, wenn sie dich interessieren). Dass OOP ein Konzept ist und keine Implementierung zeigt wohl CLOS oder Gobject ganz gut, die OOP für Common Lisp bzw. C bieten.

Und natürlich, es ist oft auch wert, einen Blick über den Tellerrand zu riskieren, viele Programmiersprachen bieten interessante Möglichkeiten ein Problem zu lösen. Wobei man aber auch zugeben muss, dass nicht alle Programmiersprachen sich zur Lösung eines Problems auch eignen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Klapperschlange
User
Beiträge: 6
Registriert: Freitag 4. Januar 2008, 15:55
Kontaktdaten:

Du kannst auch Ruby? Davon hab ich auch viel Gutes gehört - soll mit realtiv wenig Befehlen viel machen können. Aber erstmal werd ich mal versuchen in Python einzusteigen.

Ist zwar vielleicht eine doofe Frage in einem python-Forum aber ist python eine Alternative zu C bzw. C++ ? Bzw. auf welchen Gebieten liegen die Vor-/Nachteile?

Wird so langsam Offtopic aber...
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Klapperschlange hat geschrieben:Ist zwar vielleicht eine doofe Frage in einem python-Forum aber ist python eine Alternative zu C bzw. C++ ? Bzw. auf welchen Gebieten liegen die Vor-/Nachteile?

Wird so langsam Offtopic aber...
Nein, ist keine doofe Frage, in einem Programmier-Forum! :wink:

Schau mal hier: www.Programmiersprachen besprechen wir gelegentlich öfter in unserem schönen Python-Forum, man muss nur mal die Suchfunktion benutzen.de
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Klapperschlange hat geschrieben:Du kannst auch Ruby? Davon hab ich auch viel Gutes gehört - soll mit realtiv wenig Befehlen viel machen können. Aber erstmal werd ich mal versuchen in Python einzusteigen.
Was heißt können. Nutzen können, kann ichs, ja. Ist letztendlich von der Syntax her recht ähnlich, nur unübersichtlicher.

Ob ich damit auch richtig gute Programme schreiben kann, die ideomatisches Ruby sind: eher nicht. Den Bedarf habe ich schlicht nicht - ich bevorzuge Python, auch wenn Ruby einige coole (und weniger coole) Features hat.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
bushman
User
Beiträge: 8
Registriert: Donnerstag 27. Dezember 2007, 14:14
Kontaktdaten:

Hallo Klapperschlange,
du solltest dein Programm nochmals testen. Mit großen Buchstaben funktioniert es nicht. Wenn dies beispielsweise dein Lehrer testet und Großbuchstaben verwendet so tritt ein Fehler auf.
Vingdoloras
User
Beiträge: 53
Registriert: Sonntag 2. Dezember 2007, 18:25

Falls du A Byte of Python durch hast, kann ich dir noch "Python 2.x" empfehlen. Dieses Buch wird nichtmehr gedruckt, ich habe dafür etwas suchen müssen. Einige Bereiche beschreibt es zwar nicht so ausführlich, wie A byte of Python, aber dafür spricht es auch ganz andere interessante Bereiche an. Alles (naja fast alles), was ich weiß, habe ich aus diesen beiden Büchern, da ich erst seit einem knappen halben Jahr Informatik in der Schule habe und wir dort noch nicht so viel gemacht haben. Auch wenn es mir an praktischer Erfahrung noch mangelt (siehe mein Sudokuprogramm: ich mache einige Sachen ziemlich umständlich, da ich einige [den Code extrem verkürzende und trotzdem einfache] Sachen nicht weiß bzw. aus mangelnder praktischer Erfahrung nicht anwende), lassen sich damit schon einige schöne Sachen machen. Zusätzlich lernt man hier im Forum auch noch dazu (ich glaube, ich habe hier im Forum schon fast so viel gelernt, wie im Unterricht :wink: )
Vingdoloras
User
Beiträge: 53
Registriert: Sonntag 2. Dezember 2007, 18:25

@ Leonidas: Ich hab deine Version von dem Programm noch etwas erweitert, ich hoffe das stört dich nicht :wink: vorher lieferte es eine Fehlermeldung, wenn der Text Großbuchstaben oder Sonderzeichen (oder irgendetwas anderes, was kein kleiner Buchstabe war) enthielt. Jetzt werden Großbuchstaben auch verschlüsselt (und bleiben groß) und Sonderzeichen bleiben gleich.

Code: Alles auswählen

from string import ascii_lowercase, ascii_uppercase

class Ring(list):
    def __getitem__(self, index):
        real_index = index % len(self)
        return list.__getitem__(self, real_index)

lower_ring = Ring(ascii_lowercase)
upper_ring = Ring(ascii_uppercase)

move_each = int(raw_input('How many digits to rotate:'))
text = raw_input('Text: ')

encoded_text = list()
for char in text:
    if (char not in ascii_lowercase and char not in ascii_uppercase):
        encoded_text.append(char)
    elif char in ascii_lowercase:
        new_index = lower_ring.index(char) + move_each
        new_char = lower_ring[new_index]
        encoded_text.append(new_char)
    elif char in ascii_uppercase:
        new_index = upper_ring.index(char) + move_each
        new_char = upper_ring[new_index]
        encoded_text.append(new_char)

print ''.join(encoded_text)
BlackJack

Es gibt auf Zeichenketten die Methoden `islower()` und `isupper()`. Das ist wohl besser als die Buchstaben in anderen Zeichenketten suchen zu lassen. Und die erste ``if``-Abfrage solltest Du einfach als ``else`` nach unten ziehen, anstatt explizit ab zu fragen ob das Zeichen nicht gross und nicht klein ist.
Benutzeravatar
Klapperschlange
User
Beiträge: 6
Registriert: Freitag 4. Januar 2008, 15:55
Kontaktdaten:

So ich bins nochmal; hab jetzt die Caesar- und die Vigenère-Verschlüsselung nochmal neu implementiert und ein bisschen was geändert (hab die Erklärungen für den Lehrer mal dringelassen)

Hier der Code für Caesar

Code: Alles auswählen

#!/usr/bin/env python
# File name: caesar.py
import time
import sys

print "Viel Spass mit meinem Programm fuer eine Caesar-Verschluesselung"
print "Bitte nur zusammenhaengende Kleinbuchstaben von a-z benutzen!"

#--------------------------------------------------------------------------------------
#Definitionen

#Ja/Nein-Abfrage definieren
def jnabfrage(text):
    while True:
        global var
        var = raw_input(text)
        if var != "j" and var != "n":
            print "\nBitte geben Sie 'j' oder 'n' ein!"
            continue
        if var == "j" or var == "n":
            break

#Text importieren definieren
def textimport(aufforderung):
    while True:
        global var
        try:
            verzeichnis = raw_input(aufforderung)
            h = file(verzeichnis, 'rb')
            var = h.read()
            h.close()
        except IOError:
            print "\nDiese Datei existiert nicht: Bitte ueberpruefen Sie den Pfad!"
            continue
        except:
            print "\nEs ist ein unerwarteter Fehler aufgetreten; das Programm muss neu gestartet werden"
            time.sleep(5)
            sys.exit()
        else:
            break

#Alphabet definieren
alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

#--------------------------------------------------------------------------------------
#Abfragen

#Chiffrieren oder Dechiffrieren?-Abfrage
jnabfrage('\n\nSoll chiffriert (j) oder soll dechiffriert werden (n)? ')
t_chiff = var

#Textanpassung
if t_chiff == "j":
    t_anp1 = 'Klartext'
    t_anp2 = 'Geheimtext'
else:
    t_anp1 = 'Geheimtext'
    t_anp2 = 'Klartext'

#Abfrage der Anzahl der Verschiebungsstellen
while True:
    try:
        stellen = int(raw_input('\nUm wieviele Stellen soll das Alphabet verschoben werden? '))
    except ValueError:
        print "\nDies ist keine Zahl! Bitte eine Zahl eingeben!"
        continue
    except:
        print "\nEs ist ein unerwarteter Fehler aufgetreten; das Programm muss neu gestartet werden"
        time.sleep(5)
        sys.exit()
    else:
        break

#Textdatei ausgeben?-Abfrage
jnabfrage('\nSoll der '+t_anp2+' in einer Textdatei ausgegeben werden (j/n)? ')
t_ausgabe = var

#Soll eine Textdatei importiert werden?
jnabfrage('\nSoll eine '+t_anp1+'datei importiert werden (j/n)? ')
t_import = var

#Klartext
#Aus Textdatei
if t_import == "j":
    textimport('\nBitte Verzeichnis und Dateiname der .txt-Datei des '+t_anp1+'es angeben: ')
    klartext = var
#Als Eingabe
else:
    if t_chiff == "j":
        klartext = raw_input('\nEinen Text zum Verschluesseln eingeben: ')
    else:
        klartext = raw_input('\nEinen Text zum Entschluesseln eingeben: ')

#--------------------------------------------------------------------------------------

#Klartext in eine Liste umwandeln
l_klartext = list(klartext)
#Geheimtextliste erstellen
l_geheimtext = []

#--------------------------------------------------------------------------------------
#Verschluesselung

#Index
i = 0
#Chiffrierung (Dechiffrierung)
try:
    while i < len(l_klartext):
        klartextzahl = alphabet.index(l_klartext[i])
        if t_chiff == "j":
            geheimtextzahl = (klartextzahl + stellen)%len(alphabet)
        else:
            geheimtextzahl = (klartextzahl - stellen)%len(alphabet)
        geheimtextbuchstabe = alphabet[geheimtextzahl]
        l_geheimtext.append(geheimtextbuchstabe)
        i = i + 1
except KeyError:
    print "\n\nEs wurden unzulaessige Zeichen benutzt; das Programm muss neu gestartet werden"
    time.sleep(5)
    sys.exit()

except:
    print "\nEs ist ein unerwarteter Fehler aufgetreten; das Programm muss neu gestartet werden"
    time.sleep(5)
    sys.exit()

#--------------------------------------------------------------------------------------
#Ausgabe

#Geheimtextstring erstellen
geheimtext = ""
#Index
j = 0

#Ausgabe als Textblock
while j < len(l_geheimtext):
    geheimtext = geheimtext + l_geheimtext[j]
    j = j + 1
#Ausgabe in Konsole
if t_ausgabe == "n":
    print "\nDies ist der "+t_anp2+": "+geheimtext
#Ausgabe als Textdatei
else:
    f = file('crypto.txt', 'w')
    f.write(geheimtext)
    f.close()
    print "\nDie "+t_anp2+"datei heisst: crypto.txt"

#--------------------------------------------------------------------------------------
#Beenden

raw_input('\n\nZum Beenden "Enter" druecken!')
Und hier der gekürzte Code für Vigenère (unterscheidet sich nur in einigen Punkten):

Code: Alles auswählen

#!/usr/bin/env python
# File name: vigenere.py

[...]

#Alphabet definieren
alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

#--------------------------------------------------------------------------------------
#Abfragen      

[...]

#Soll ein Schluessel importiert werden? 
jnabfrage('\nSoll ein Schluessel importiert werden (j/n)? ')
s_import = var

[...]

#Schluessel
#Aus Textdatei
if s_import == "j":
    print
    textimport('\nBitte Verzeichnis und Dateiname der .txt-Datei des Schluessels angeben: ')
    schluessel = var
    
#Als Eingabe
else:
    schluessel = raw_input('\nBitte einen Schluessel angeben: ')

#--------------------------------------------------------------------------------------

#Klartext in eine Liste umwandeln
l_klartext = list(klartext)
#Schluessel in eine Liste umwandeln
l_schluessel = list(schluessel)
#Geheimtextliste erstellen
l_geheimtext = []

#--------------------------------------------------------------------------------------
#Verschluesselung

#Index
i = 0
#Chiffrierung (Dechiffrierung)
try:
    while i < len(l_klartext):
        klartextzahl = alphabet.index(l_klartext[i])
        schluesselzahl = alphabet.index(l_schluessel[i % len(l_schluessel)])
        if t_chiff == "j":
            geheimtextzahl = (klartextzahl + schluesselzahl) % len(alphabet)
        else:
            geheimtextzahl = (klartextzahl - schluesselzahl) % len(alphabet)
        geheimtextbuchstabe = alphabet[geheimtextzahl]
        l_geheimtext.append(geheimtextbuchstabe)
        i = i + 1
except KeyError:
    print "\n\nEs wurden unzulaessige Zeichen benutzt; das Programm muss neu gestartet werden"
    time.sleep(5)
    sys.exit
except:
    print "\n\nEs ist ein unerwarteter Fehler aufgetreten; das Prgramm muss neu gestertet werden. Bitte ueberpruefen Sie Ihre Eingaben!"
    time.sleep(5)
    sys.exit
    
[...]
Antworten