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).
Verschlüsselungsprogramm - Caesar
Code: Alles auswählen
translation = dict(zip(l+u, l[shift:]+l[:shift]+u[shift:]+u[:shift]))
Das Leben ist wie ein Tennisball.
AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEyDu hat geschrieben:Code: Alles auswählen
translation = dict(zip(l+u, l[shift:]+l[:shift]+u[shift:]+u[:shift]))
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah!
http://paste.pocoo.org/show/290544/ <-- Neuer Code
Da Du Dich mit Verschiebechiffren beschäftigst, hier mal als Anregung mit veränderlichem Offset und Schlüssel (Rotorstellungen):
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).
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!
Und jetzt erinnerst du dich noch einmal an "dict.get"
return "".join(cipher)[/code]
Wo bei du die Schleife gleich als List Comprehension schreiben könntest:
Oder mit map:
Oder gleich zum return:
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]
Code: Alles auswählen
cipher = map(lambda x: translation.get(x, x), plain)
Code: Alles auswählen
return "".join(translation.get(char, char) for char in plain)
Das Leben ist wie ein Tennisball.
Dieses default hab ich beim Lesen der Doku nicht verstanden :-/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]
Wow, dann wird der Code ja gleich total überschaubar … vielen vielen vielen vielen Dank, EyDu :-)Wo bei du die Schleife gleich als List Comprehension schreiben könntest:Oder mit map:Code: Alles auswählen
cipher = [translation.get(char, char) for char in plain]
Oder gleich zum return:Code: Alles auswählen
cipher = map(lambda x: translation.get(x, x), plain)
Code: Alles auswählen
return "".join(translation.get(char, char) for char in plain)
Edit #1:
Das ist übrigens die finale Version gewesen :D