Caesar Verschlüsselung codieren

Code-Stücke können hier veröffentlicht werden.
Antworten
designation_na
User
Beiträge: 2
Registriert: Freitag 20. Januar 2017, 16:13

Freitag 20. Januar 2017, 16:29

Hey :)
ich war grad am arbeiten an einer Caesar Verschlüsselung und bin nun leider auf 2 Probleme gestoßen.
1.) Warum wird bei einem bestimmten Verschiebungsfaktor (ca. 30 - 80) nicht auf die Länge der Nachricht geachtet?
2.) Falls jemand so schlau sein sollte und einen überdimensionalen Verschiebungsfaktor eingibt, brauche ich eine Möglichkeit wieder von vorne anfangen zu zählen. Hat da jemand ne Idee?

[codebox=python file=Unbenannt.txt]
def eingabe():
try:
code = input("Gebe deinen Code ein: ")
faktor = int(input("Nenne deinen Verschiebungsfaktor: "))
except:
print("Eine deiner Eingaben war ungültig...\n")
exit()
return(code, faktor)

def caesar(c, f):
print("Verschlüsselter Code: ", end="")
for i in range(len(c)):
asc = ord(c) # Schritt für Schritt umwandlung in ASCII
alph = chr(asc + f) # Rückumwandlung mir einberechnung des Verschiebungsfaktors
print(alph, end= "")

cf = eingabe()
caesar(cf[0], cf[1])
[/code]
Benutzeravatar
pyHoax
User
Beiträge: 84
Registriert: Donnerstag 15. Dezember 2016, 19:17

Samstag 21. Januar 2017, 00:31

2.) Falls jemand so schlau sein sollte und einen überdimensionalen Verschiebungsfaktor eingibt, brauche ich eine Möglichkeit wieder von vorne anfangen zu zählen. Hat da jemand ne Idee?
chr( (asc + f) % 256)


[codebox=python file=Unbenannt.txt]
def caesar(text, f):
print("Verschlüsselter Code: ", end="")
for char in text:
asc = ord(char) # Schritt für Schritt umwandlung in ASCII
alph = chr(asc + f) # Rückumwandlung mir einberechnung des Verschiebungsfaktors
print(alph, end= "")

cf = eingabe()
caesar(cf[0], cf[1])
[/code]
Aber mit der Eingabe aufpassen.. sonderlich wird es wenn keine Ascii zeichen im text sind
designation_na
User
Beiträge: 2
Registriert: Freitag 20. Januar 2017, 16:13

Sonntag 22. Januar 2017, 16:31

vielen Dank an @pyHoax

ich hab nochmal ne überarbeitete Version von dem Code geschrieben:

[codebox=python file=Unbenannt.txt]
a = input("Code: ")
b = int(input("Verschiebungsfaktor: "))
print("Verschlüsselter Code: ", end = "")
for i in range(len(a)):
c = ord(a)
print(chr((c+b)%256), end = "")
[/code]

Funktioniert sowohl im positiven als auch im negativen Bereich sehr gut!
LG
Sirius3
User
Beiträge: 8428
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 22. Januar 2017, 17:34

@designation_na: Variablennamen sollten aussagekräftig sein, das ist bei einem Buchstaben im Allgemeinen nicht gegeben. Über den Index einer Sequenz zu iterieren wird in Python als Anti-Pattern angesehen, da man über die Elemente auch direkt iterieren kann:

Code: Alles auswählen

code = input("Code: ")
shift = int(input("Verschiebungsfaktor: "))
print("Verschlüsselter Code: ", end = "")
for char in code:
    num = ord(char)
    print(chr((num + shift) % 256), end = "")
bzw.

Code: Alles auswählen

code = input("Code: ")
shift = int(input("Verschiebungsfaktor: "))
encoded = "".join(chr((ord(char) + shift) % 256) for char in code)
print("Verschlüsselter Code:", encoded)
Benutzeravatar
pyHoax
User
Beiträge: 84
Registriert: Donnerstag 15. Dezember 2016, 19:17

Sonntag 22. Januar 2017, 18:43

@designation_na
War für uns IT Freaks nicht mal eine Übung zum Aufwärmen.
Wenn du uns eine Freude machen willst dann übernehme einiges von dem von mir und Sirius3 verwendeten Python Syntax.
Du iterierst mit der 'for' Schleife über die Indexies (ist das richtig gebeugt ?) um dann einen Lookup mit den den Index über ein Listenelement zu machen.

Das ist unelegannt und auch in Python eine Performamce-Bremse.
Sirius und ich itereieren nicht über den Index der Liste sondern über die Elemente der Liste selber. Und Variablen brauchen den richtigen Namen .. das ist wie beim Rumpelstielchen.. wahre Namen haben Macht !
Mach das in Zukunft genau so und wir Forumengel erfahren instant Karma.

Danke !
ruedi_br
User
Beiträge: 12
Registriert: Montag 11. September 2017, 08:24

Dienstag 23. Januar 2018, 10:20

Hallo zusammen,
der Vierzeiler zeigt zwar, wie in Python sparsam codiert werden kann, aber geht etwas an der Schlüsselproblematik vorbei.
Das Beispiel:
Ärgerliches und übles muß probiert werden
wird verschlüsselt zu:
Î|qo|vsmro}*xn*lvo}*wé*z|ylso|~*o|nox
Erkennbar sind Klar- und geschlüsselter Text nicht gleich lang. Bei Cäsar handelt es sich jedoch um eine monoalphabetische Substitution. Und der gute alte Herr Cäsar dürfte lediglich mit Majuskeln unterwegs gewesen sein. Statt Modulo 256 käme da eher eine Konstruktion in Frage, die den Zeichenraum A..Z abbildet (mit Modulo 26), was natürlich bedeutet, den Text prä zu prozessieren, d.h. Leer- Interpunktions- und Sonderzeichen zu strippen, Umlaute und ß auszuschreiben, sowie alles in Großbuchstaben zu wandeln. :)
Benutzeravatar
darktrym
User
Beiträge: 709
Registriert: Freitag 24. April 2009, 09:26

Sonntag 18. März 2018, 23:52

Und bei der Chiffrierung verliert man dann die Information ob Umlaute verwendet wurden, klasse Idee.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Antworten