Python Output mit Groß- und Kleinschreibung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
machine98
User
Beiträge: 1
Registriert: Mittwoch 13. Oktober 2021, 17:17

Hey Leute,

ich bin leider noch ein ziemlicher Anfänger in Python und muss für eine Aufgabe einen Vigenere-Decoder erstellen, der eine verschlüsselte Nachricht aus einer Txt-Datei ausliest, diese entschlüsselt und anschließend printed. Die Entschlüsselung habe ich durch einiges Google hinbekommen, jedoch gibt meine Funktion die entschlüsselte Nachricht komplett kleingeschrieben aus. Sie soll aber eigentlich die Groß- und Kleinschreibung der verschlüsselten Nachricht beibehalten.
Hat jemand von euch eine Idee, wie ich das hinbekommen könnte? Ich bin echt am verzweifeln...

Das ist mein Code:

def decipher(dec_key):
alphabet = "abcdefghijklmnopqrstuvwxyz"
dec_string = ""

dec_key = dec_key.lower()

file_message = open("message.txt", "r")
input_string = file_message.read()
input_string = input_string.lower()
file_message.close()

string_length = len(input_string)

expanded_key = dec_key
expanded_key_length = len(expanded_key)

while expanded_key_length < string_length:
expanded_key = expanded_key + dec_key
expanded_key_length = len(expanded_key)

key_position = 0

for letter in input_string:
if letter in alphabet:

position = alphabet.find(letter)

key_character = expanded_key[key_position]
key_character_position = alphabet.find(key_character)
key_position = key_position + 1

new_position = position - key_character_position
if new_position > 26:
new_position = new_position + 26
new_character = alphabet[new_position]
dec_string = dec_string + new_character
else:
dec_string = dec_string + letter
print(dec_string)

und das ist die verschlüsselte Message aus der Txt-Datei, die ich übersetzen soll:

Taei Ambervlq,

Jdi cblu plrm byrmuxq jdi nhpbz jfk lus hzlaeriibci
xikpcuj Tfkrkcec tlt Yejmgba lrl re cs nxqj wrfmfun
xnh fkjhixb qjh jxtujxp ecqcyvl zuyellc ma lroc qhvvtbo
zmjvmlavvw y wnirm jqjh kayj si nbjb yece Zhwdze yvpii
mfu krv asdzvvw bubmexb baexnci plrm uu zs ehr yjxvgb
jk kzoc jk xyx Aqoxzegqjw. Kac bwru bq hegy bl iqkrk ydz
kfeb, qjh nx uyhp gkmlkov t uqn mw mfu heew gi wwjbedah
kh rxa Grlryhmrgq.

Rawk kcwwvul,
B. Zkef BG

Danke im Voraus und liebe Grüße :)
Benutzeravatar
__blackjack__
User
Beiträge: 14069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@machine98: Du schmeisst die Information halt gleich nach dem Einlesen weg, wo Du die Eingabedaten komplett in Kleinbuchstaben umwandelst. Du musst die Information behalten. Beispielsweise beim einzelnen Buchstaben vor dem dekodieren schauen ob er gross ist, dann den Buchstaben in einen Kleinbuchstaben umwandeln, dekodieren, und das Ergebnis falls der Ausgangsbuchstabe gross war, wieder in einen Grossbuchstaben umwandeln.

Das hier ist kaputt = toter Code, weil die Bedingung grundsätzlich immer falsch ist, denn wenn man von einer Zahl von 0 bis 25 eine andere Zahl von 0 bis 25 abzieht, kann das Ergebnis niemals grösser als 26 sein. Nicht mal grösser als 25.

Code: Alles auswählen

            if new_position > 26:
                new_position = new_position + 26
Und falls `new_position` tatsächlich hätte grösser werden können, wäre das drauf addieren von 26 auch total falsch, denn das wird dann ja mindestens 53 und lässt sich nicht ohne eine Ausnahme auszulösen als Index in eine Zeichenkette mit der Länge 26 verwenden.

Das verlängern des Schlüssels ist überflüssig wenn man beim Zugriff über das `i` den Modulo-Operator verwendet. Der dürfte auch beim Berechnen der `new_position` interessant sein.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten