⭐️ Antike Verschlüsselung mit Python
Skytale
to__skytale.py
klartext = 'Skytale'
schlüssel = 3
zeilen = []
# füge für jede Zeile einen leeren Text ein
for i in range(schlüssel):
zeilen.append('')
# verteile die Buchstaben auf die Zeilen
nr = 0
for buchstabe in klartext:
zeilen[nr] = zeilen[nr] + buchstabe
nr = nr + 1
if nr == schlüssel:
nr = 0
# alle Zeilen mit einer neuen Zeile verknüpfen
verschlüsselt = '\n'.join(zeilen)
print(verschlüsselt)
from__skytale.py
verschlüsselt = '''\
Ste
ka
yl'''
zeilen = verschlüsselt.splitlines()
# die erste Zeile gibt vor, wie viele Spalten es gibt
spalten = len(zeilen[0])
klartext = ''
# für jede Spalte...
for spalte in range(spalten):
# wird in jeder Zeile...
for zeile in zeilen:
if len(zeile) > spalte:
# der Buchstabe in dieser Spalte dem Text hinzugefügt
klartext = klartext + zeile[spalte]
print(klartext)
Polybios
to__polybios.py
QUADRAT = [
'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'K',
'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U',
'E', 'X', 'Y', 'Z', ' '
]
klartext = 'Hallo'
klartext = klartext.upper().replace('J', 'I').replace('V', 'U')
verschlüsselt = ''
for buchstabe in klartext:
index = QUADRAT.index(buchstabe)
spalte = index % 5 # berechnet den ganzzahligen Rest bei einer Division durch 5
zeile = index // 5 # berechnet die ganzzahlige Division durch 5
verschlüsselt = verschlüsselt + f'{zeile + 1}{spalte + 1} '
print(verschlüsselt.strip()) # strip entfernt Leerzeichen an den Rändern
Aufgabe
Lesen Sie das Programm durch und versuchen Sie, jede Zeile zu verstehen.
Flicken Sie den Code, so dass der verschlüsselte Text lesbar wird.
from__polybios.py
QUADRAT = [
'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'K',
'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U',
'E', 'X', 'Y', 'Z', ' '
]
verschlüsselt = '35 34 31 53 12 24 34 43'
klartext = ''
zahlen = verschlüsselt.split(' ')
for zahl in zahlen:
zeile = int(zahl[0])
spalte = int(zahl[1])
index = 0
klartext = klartext + QUADRAT[index]
print(klartext)
Caesar-Chiffre
to__caesar.py
ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
SCHLÜSSEL = 'D'
ROT = ALPHABET.index(SCHLÜSSEL)
klartext = 'CAESAR'
klartext = klartext.upper()
verschlüsselt = ''
for buchstabe in klartext:
index = ALPHABET.index(buchstabe) + ROT
index = index % 26 # ganzzahliger Rest bei Division durch 26
verschlüsselt = verschlüsselt + ALPHABET[index]
print(verschlüsselt)
Aufgabe
Ändern Sie den Code so ab, dass der verschlüsselte Text wieder entschlüsselt werden kann.
from__caesar.py
ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
SCHLÜSSEL = 'D'
ROT = ALPHABET.index(SCHLÜSSEL)
verschlüsselt = 'JDLXV'
klartext = ''
verschlüsselt = klartext.upper()
for buchstabe in verschlüsselt:
index = 0
klartext = klartext + ALPHABET[index]
print(klartext)
⭐️ Zusatz
Sie haben eine geheime Nachricht abgefangen, kennen aber den Schlüssel nicht. Sie wissen aber, dass ALCZLJ
ein sinnvolles Wort ergeben muss. Schreiben Sie ein Programm, das alle möglichen Schlüssel durchprobiert und jeweils den entschlüsselten Text ausdruckt.
Verwenden Sie die Ausgangslage aus dem obigen Programm.
hack__caesar.py
verschlüsselt = 'ALCZLJ'
Substitutions-Chiffre
to__substitution.py
ALPHABET = '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'.split(' ')
SCHLÜSSEL = 'I S X D L Y A V E B F G C W M Z N K O R H Q J P U T'.split(' ')
klartext = 'HEUTE GEHE ICH IM WALD JOGGEN'
klartext = klartext.upper()
verschlüsselt = ''
for buchstabe in klartext:
if buchstabe in ALPHABET:
index = ALPHABET.index(buchstabe)
verschlüsselt = verschlüsselt + SCHLÜSSEL[index]
else:
verschlüsselt = verschlüsselt + buchstabe
print(verschlüsselt)
from__substitution.py
ALPHABET = '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'.split(' ')
SCHLÜSSEL = 'I S X D L Y A V E B F G C W M Z N K O R H Q J P U T'.split(' ')
verschlüsselt = 'EXV SEFL QMW CIAAGEWALW WIXV SELG'
verschlüsselt = verschlüsselt.upper()
klartext = ''
for buchstabe in verschlüsselt:
if buchstabe in SCHLÜSSEL:
index = SCHLÜSSEL.index(buchstabe)
klartext = klartext + ALPHABET[index]
else:
klartext = klartext + buchstabe
print(klartext)
schlüssel.py
from random import shuffle
schlüssel='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'.split(' ')
shuffle(schlüssel)
print(' '.join(schlüssel))