Verschlüsselungsprogramm - Caesar

Code-Stücke können hier veröffentlicht werden.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

So, mit Dictionary:
http://paste.pocoo.org/show/290515/
Aber ich fühle mich immer schlecht, wenn ich Code von anderen fast 1:1 übernehme (auch wenn ich es verstanden hab). :|
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hat es einen Grund, dass du zwei Dictionaries verwendest? ;-)
Das Leben ist wie ein Tennisball.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

EyDu hat geschrieben:Hat es einen Grund, dass du zwei Dictionaries verwendest? ;-)
Ich denke ja. Ich möchte, dass Groß- und Kleinschreibung richtig bleiben!11!1!einself!1!1 ;-)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

translation = dict(zip(l+u, l[shift:]+l[:shift]+u[shift:]+u[:shift]))
Das Leben ist wie ein Tennisball.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

EyDu hat geschrieben:

Code: Alles auswählen

translation = dict(zip(l+u, l[shift:]+l[:shift]+u[shift:]+u[:shift]))
Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah! :idea:
http://paste.pocoo.org/show/290544/ <-- Neuer Code
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Da Du Dich mit Verschiebechiffren beschäftigst, hier mal als Anregung mit veränderlichem Offset und Schlüssel (Rotorstellungen):

Code: Alles auswählen

from string import printable
from collections import deque

CHARS = printable

class Rotor(deque):
    def __init__(self, chars, period, start, direction):
        self.start = chars[start]
        self.period = period
        self.actual_step = 0
        self.direction = direction
        deque.__init__(self, chars)
        while self[0] != self.start:
            self.rotate(1)
    def get_char(self, num):
        self.actual_step += 1
        if self.period <= self.actual_step:
            self.actual_step = 0
            self.rotate(self.direction)
        return self[num]
        
class NotEnigma(object):
    def __init__(self, it, chars=CHARS):
        self.chars = chars
        self._rotors = [Rotor(chars, period, start, direction)
                        for period, start, direction in it]
    def translate(self, s):
        for rotor in self._rotors:
            s = ''.join(rotor.get_char(self.chars.index(i)) for i in s)
        return s

s = 'Hello World!'
ne1 = NotEnigma(((1, 5, -7), (2, 13, -17)))
encrypted = ne1.translate(s)
print encrypted                # --> '":1b5/%/ ~%

ne2 = NotEnigma(((1, -5, 7), (2, -13, 17)))
print ne2.translate(encrypted) # --> Hello World!
Damit gewinnst Du Sicherheit, da Häufigkeitsgipfel geglättet werden. Das Prinzip ist an die Enigma angelehnt. Diese hatte allerdings noch ein paar mehr technische Einzelheiten, die z.T. der Sicherheit zuträglich als auch abträglich waren (unterschiedliche Zeichenverdrahtungen pro Scheibe, Umkehrscheibe, Steckerbrett).
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Und jetzt erinnerst du dich noch einmal an "dict.get" ;-)

Code: Alles auswählen

    l = string.ascii_lowercase
    u = string.ascii_uppercase

    cipher = []
    translation = dict(zip(l+u, l[shift:]+l[:shift]+u[shift:]+u[:shift]))
    for char in plain:
        cipher.append(translation.get(char, char)

return "".join(cipher)[/code]

Wo bei du die Schleife gleich als List Comprehension schreiben könntest:

Code: Alles auswählen

cipher = [translation.get(char, char) for char in plain]
Oder mit map:

Code: Alles auswählen

cipher = map(lambda x: translation.get(x, x), plain)
Oder gleich zum return:

Code: Alles auswählen

return "".join(translation.get(char, char) for char in plain)
Das Leben ist wie ein Tennisball.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

EyDu hat geschrieben:Und jetzt erinnerst du dich noch einmal an "dict.get" ;-)

Code: Alles auswählen

    l = string.ascii_lowercase
    u = string.ascii_uppercase

    cipher = []
    translation = dict(zip(l+u, l[shift:]+l[:shift]+u[shift:]+u[:shift]))
    for char in plain:
        cipher.append(translation.get(char, char)

return "".join(cipher)[/code]
Dieses default hab ich beim Lesen der Doku nicht verstanden :-/
Wo bei du die Schleife gleich als List Comprehension schreiben könntest:

Code: Alles auswählen

cipher = [translation.get(char, char) for char in plain]
Oder mit map:

Code: Alles auswählen

cipher = map(lambda x: translation.get(x, x), plain)
Oder gleich zum return:

Code: Alles auswählen

return "".join(translation.get(char, char) for char in plain)
Wow, dann wird der Code ja gleich total überschaubar … vielen vielen vielen vielen Dank, EyDu :-)

Edit #1:
Das ist übrigens die finale Version gewesen :D
Antworten