Zum Hauptinhalt springen
Version: 24f

⭐️ 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))