Caesar-Verschlüsselung

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
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