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

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

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

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: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@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

@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: 13
Registriert: Montag 11. September 2017, 08:24

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: 784
Registriert: Freitag 24. April 2009, 09:26

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
Adri
User
Beiträge: 6
Registriert: Sonntag 31. Oktober 2021, 19:21

Hi, ich habe mal etwas mit dem Code herumexperimentiert, Ich weiß das ist jetzt ziemlich spät, aber mit dem Modulo 256 werden die Zeichen die Verwendet werden nicht begrenzt, Beispiel Modulo 26, es werden immernoch Sonderzeichen verwendet. Könnte mir vielleicht jemand hier erklären, was genau dieses Rest 256 macht??
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das % 256 beschraenkt einfach nur die moeglichen Zahlwerte auf den fuer ein Byte erlaubten Zahlenraum von 0..255. Nicht mehr, nicht weniger. Achtung: das funktioniert nur, wenn der Text bereits als *Bytes* vorliegen! Bei Python 3 ist "string" aber immer unicode, und dann passiert sowas:

Code: Alles auswählen

>>> ord('€')
8364
Da muss man also am besten vorher filtern, dass sowas nicht vorkommt.
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei ich nochmal anmerken möchte was ich auch schon im anderen Thema von Adri angemerkt habe: Wenn man das einfach auf Code-Points ≤255 beschränkt, selbst wenn man vorher testet, das dabei keine grösseren Codepoints (de)kodiert werden: das Ergebnis muss dann kein druckbarer und damit auch kein aus- und eingebbarer *Text* mehr sein. Und im anderen Thema soll das Ver- und Entschlüsseln ja via Texteingabe per `input()` oder GUI passieren. Man kann da einfach nicht alle Steuerzeichen die dabei auftreten können a) ausgeben, und b) auch nicht wieder eingeben. Das macht also keinen Sinn bei so einer Benutzerschnittstelle mit Bytes zu arbeiten. Das kann man machen wenn man Dateiinhalte ver- und entschlüsselt, aber nicht mit reinem Text.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten