Seite 1 von 1

Monoalphabetische Verschlüsselung

Verfasst: Mittwoch 19. Mai 2021, 10:19
von Ishmeet Vohra
Hallo Zusammen,

ich sitze gerade an einer Aufgabe zur monoalphabetischen Verschlüsselung und komme nicht weiter.
Das Prinzip ist ganz einfach. Man sucht sich sich ein beliebiges Schlüsselwort z.B LAGERREGAL. Dann geht man die Buchstaben im Schlüsselwort durch. Dabei nimmt man alle Buchstaben die doppelt vorkommen nicht mit. Dann erhält man den Schlüssel, hier: LAGER
Jetzt legt man den Schlüssel unter das Alphabet und erhält eine Art verschobenes Alphabet. Der nächste Buchstabe ist der Buchstabe der Nach dem letzten Buchstaben des Schlüssels folgt. Jeder Buchstabe der schon verkam wird weggelassen und es wird mit dem nächsten weitergemacht. Ist man bei Z angelangt, geht es mit A weiter.

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
L A G E R S T U V W X Y Z B C D F H I J K M N O P Q

Jetzt kann man das auf einen Text anwenden und ihn verschlüsseln. Jedes A im Text wir mit einem L ersetzt, jedes B mit einem A, jedes C mit einem G und immer so weiter.

Wie man den Schlüssel aus einem Schlüsselwort bekommt habe ich schon:

Code: Alles auswählen

import matplotlib.pyplot as plt


text_clear = open("Higgs.txt").read()
großbuchstaben = text_clear.upper()
ascii = [chr(n) for n in range(ord('A'), ord('Z')+1)]

keyword="LAGERREGAL"

key = []
for c in keyword:
     if c in key: continue 
     if c in ascii: key += [c]
     
print(key)

Jetzt wäre der nächste Schritt glaub ich dieses verschobene Alphabet zu erzeugen. Dann müsste man A auf ein L abbilden, B auf ein A, C auf ein G und so weiter. Und dann zum Schluss das im Text verwirklichen. Ich weis jedoch nicht wie ich das so richtig angehen soll.

Es wäre sehr nett wenn Jemand mir da weiterhelfen könnte.
LG
Ishmeet

Re: Monoalphabetische Verschlüsselung

Verfasst: Mittwoch 19. Mai 2021, 10:48
von Sirius3
Für was brauchst Du hier matplotlib?
Dateien öffnet man mit dem with-Statement, damit sie auch wieder geschlossen werden.
Du hast jetzt noch nicht eingebaut, dass nach dem R mit S weiter gemacht wird.
Packe das Lesen der Datei und das Erzeugen des Schlüssels und das Verschlüsseln jeweils in Funktionen.
Das was Du ascii nennst, ist string.ascii_uppercase.
Um ein Element an eine Liste anzuhängen, erzeugt man nicht erst eine Einelementige Liste, sondern benutzt einfach `append`.

Code: Alles auswählen

import string

def read_text(filename):
    with open(filename, encoding="ASCII") as text:
        return text.read().upper()

def create_key(keyword):
    key = []
    for letter in keyword:
     if letter not in key and letter in string.ascii_uppercase:
        key.append(letter)
    # TODO: extend key to all letters
    return key

def main():
    key = create_key("LAGERREGAL")
    text = read_text("Higgs.txt")
    print(key)

if __name__ == "__main__":
    main()
Zum Verschlüsseln benutzt man str.translate.

Re: Monoalphabetische Verschlüsselung

Verfasst: Mittwoch 19. Mai 2021, 11:14
von DeaD_EyE
str.translate kann str übersetzen und str.maketrans erstellt ein Mapping aus quelle -> ziel.
collections.deque hat die Methode rotate, die sich nutzen lässt, um die liste zu rotieren.

Code: Alles auswählen

import string
from collections import deque


target_lower = deque(string.ascii_lowercase)
target_upper = deque(string.ascii_uppercase)

# index finden und deque rotieren
target_lower.rotate(-target_lower.index("l")) 
target_upper.rotate(-target_upper.index("L"))

# wieder einen str erstellen
target = "".join(target_lower) +  "".join(target_upper)

# string.ascii_letters => a b c ... A B C ...

translation = str.maketrans(string.ascii_letters, target)
rev_translation = {v: k for k, v in translation.items()}

print("Hello World".translate(translation))
print("Hello World".translate(translation).translate(rev_translation))
Einfacher geht es noch, wenn man Kleinbuchstaben und Großbuchstaben nicht gesondert behandelt, sondern komplett rotiert.
Alle Zeichen, die nicht im Mapping abbgebildet sind, werden auch nicht ersetzt. D.h. Umlaute, Satzzeichen usw. bleiben bestehen.

PS: Schau auf jeden Fall mal nach, was deque und str alles kann und überlege, wieso vor target_lower.index("l") ein Minus ist.