Beispiel - Verschlüsselung von Nachrichten

Ein einfaches Verfahren

Im dem Buch Die wilden Hühner von Cornelia Funke benutzt eine Gruppe von Schüler(innen) eine Art Geheimschrift, um Nachrichten verschlüsselt weiterzugeben. Hier ein Beispiel für eine verschlüsselte Nachricht:

neffert mmedfua knehcdä shcänol esuapet rowedoc nhuht

Aufgabe 1

Alles klar? Hast du die Nachricht bereits entschlüsselt? Wenn nicht, dann benutze diese Hilfe:

treffen aufdemm knehcdä shcänol esuapet rowedoc nhuht

Aufgabe 2

Verschlüssele analog eine selbst gewählte Nachricht mit einer vorgegebenen Blocklänge und gib sie an deinen Nachbarn zum Entschlüsseln weiter.

Der Verschlüsselungsalgorithmus

Wir spielen das Verschlüsselungsverfahren zuerst mit der Nachricht 'heuteabdersechtenstundehitzefrei' konkret durch. Für die Aufteilung in Blöcke benutzen wir die Wortlänge 6.

teilWort : 
altesWort: heuteabdersechtenstundehitzefrei
neuesWort:
# 
teilWort : heutea
altesWort: bdersechtenstundehitzefrei
neuesWort: aetueh
# 
teilWort : bderse
altesWort: chtenstundehitzefrei
neuesWort: aetueh esredb
# 
teilWort : chtens
altesWort: tundehitzefrei
neuesWort: aetueh esredb snethc
# 
teilWort : tundeh
altesWort: itzefrei
neuesWort: aetueh esredb snethc hednut
# 
teilWort : itzefr
altesWort: ei
neuesWort: aetueh esredb snethc hednut rfezti
# 
teilWort : ei
altesWort: 
neuesWort: aetueh esredb snethc hednut rfezti ie

Dieses Verfahren lässt sich leicht automatisieren. Hier eine mögliche Formulierung des Algorithmus.

ALGORITHMUS verschluesselterText:
Übergabe: text, blocklaenge
alterText = text
neuerText = ''
solange die Länge von alterText größer oder gleich blocklaenge ist:
    teilwort = erstes Teilwort mit der Länge blocklaenge von alterText
    alterText = Rest von alterText ohne das erste Teilwort mit Länge blocklaenge
    neuerText = neuerText, dann ein Leerzeichen, dann die Umkehrung von teilwort
teilwort = alterText
neuerText = neuerText, dann ein Leerzeichen, dann die Umkehrung von teilwort
Rückgabe: neuerText

Das automatisierte Verschlüsseln von Texten soll mit Hilfe einer geeigneten Funktion erfolgen. Das folgende Black-Box-Diagramm verdeutlicht das Verhalten dieser Verschlüsselungsfunktion.

<Black-Box-Diagramm><Funktionsname>verschluesselterText</Funktionsname><Übergaben><Übergabe><Wert>'heuteabdersechtenstundehitzefrei'</Wert><Variable>text</Variable><Typ>str</Typ></Übergabe><Übergabe><Wert>6</Wert><Variable>blocklaenge</Variable><Typ>int</Typ></Übergabe></Übergaben><Rückgabe><Typ>str</Typ><Wert>'aetueh esredb snethc hednut rfezti ie'</Wert></Rückgabe></Black-Box-Diagramm>

Ziel ist es, die beschriebene Funktion unter Berücksichtigung des gezeigten Algorithmus zu implementieren.

Verarbeitung von Zeichenketten

Texte werden als Objekte von Typ Zeichenketten dargestellt. Bevor das oben beschriebene Verfahren zum Verchlüsseln von Texten in Python implementiert werden kann, muss du dich mit der Verarbeitung von Zeichenketten auseinandersetzen. Bearbeite hierzu vorab die folgenden Aufgaben. Die erforderlichen Hintergrundinformationen findest du im nächsten Abschnitt.

Aufgabe 3: Zugriff auf die Zeichen einer Zeichenkette

Der folgende Python-Dialog zeigt, wie man auf einzelne Zeichen einer Zeichenkette zugreift.

>>> text = 'Heute hitzefrei!'
>>> text[4]
'e'
>>> text[5]
' '
>>> text[15]
'!'
>>> text[16]
Traceback (most recent call last):
  File ...
    text[16]
IndexError: string index out of range
>>> len(text)
16
>>> text[len(text)-1]
'!'
>>> text[0] = 'h'
Traceback (most recent call last):
  File ...
    text[0] = 'h'
TypeError: 'str' object does not support item assignment

Probiere das mit einem eigenen Text selbst aus. Kläre dabei die folgenden Fragen: Wie wird eine Zeichenkette in Python dargestellt? Wie greift man auf die einzelnen Zeichen einer Zeichenkette zu? Was muss man dabei beachten? Lies dir hierzu auch die Ausführungen auf der nächsten Seite durch.

Aufgabe 4: Zugriff auf mehrere Zeichen einer Zeichenkette

Der folgende Python-Dialog zeigt, wie man auf Teile einer Zeichenkette zugreift.

>>> text[2:5]
'ute'
>>> text[0:6]
'Heute '
>>> text[:6]
'Heute '
>>> text[6:]
'hitzefrei!'
>>> text
'Heute hitzefrei!'
>>> text = text[6:]
>>> text
'hitzefrei!'

Probiere das mit einem eigenen Text selbst aus. Erkläre, wie die Ergebnisse zustande kommen.

Aufgabe 5: Eine Zeichenkette durchlaufen

(a) Es gibt zwei Möglichkeiten, eine Zeichenkette als sequentielles Datenobjekt Schritt für Schritt zu durchlaufen: zum Einen über den Index, zum Anderen direkt über die Zeichen. Lies dir erst einmal die Ausführungen zu diesem Thema auf der nächsten Seite durch.

(b) Stelle erst eine Vermutung auf, was das folgende Programm leistet. Überprüfe anschließend deine Vermutung. Erkläre dann die einzelnen Anweisungen des Programms.

# Initialisierung
text = 'Heute hitzefrei!'
# Verarbeitung
i = 0
while i < len(text):
    print(text[i])
    i = i+1

(c) Stelle auch hier erst eine Vermutung auf, was das folgende Programm leistet. Überprüfe anschließend deine Vermutung. Erkläre dann die einzelnen Anweisungen des Programms.

# Initialisierung
text = 'Heute hitzefrei!'
# Verarbeitung
zaehler = 0
for zeichen in text:
    if zeichen in 'aeiou':
        zaehler = zaehler + 1
# Ausgabe
print(zaehler)

Aufgabe 6: Eine Zeichenkette aufbauen

Häufig kommt es vor, dass man eine neue Zeichenkette ausgehend von einer bereits bestehenden Zeichenkette aufbauen möchte. Hierzu verwendet man meist den +-Operator. Lies dir die entsprechenden Ausführungen auf der nächsten Seite durch.

(a) Ergänze den folgenden Python-Dialog. Überprüfe deine Ergebnisse mit Python.

>>> text1 = 'ROT'
>>> text2 = ''
>>> text2 = text1[0] + text2
>>> text1 = text1[1:] 
>>> text1
...
>>> text2
...
>>> text2 = text1[0] + text2
>>> text1 = text1[1:] 
>>> text1
...
>>> text2
...
>>> text2 = text1[0] + text2
>>> text1 = text1[1:] 
>>> text1
...
>>> text2
...

(b) Was leistet das gezeigte Programm? Kannst du es ohne vorheriges Ausprobieren vorhersagen? Überprüfe deine Vermutung.

# Initialisierung
text = 'Heute hitzefrei!'
# Verarbeitung
textNeu = ''
for zeichen in text:
    textNeu = textNeu + zeichen + zeichen 
# Ausgabe
print(textNeu)

Implementierung des Verschlüsselungsverfahrens

Mit den Grundoperationen zur Verarbeitung von Zeichenketten lässt sich jetzt das Verschlüsselungsverfahren implementieren. Bearbeite hierzu die folgenden Aufgaben.

Aufgabe 7: Eine Zeichenkette umkehren

Es ist günstig, erst einmal eine Funktion zur Umkehrung von Zeichenketten zu entwickeln.

<Black-Box-Diagramm><Funktionsname>umgekehrt</Funktionsname><Übergaben><Übergabe><Wert>'hallo'</Wert><Variable>wort</Variable><Typ>str</Typ></Übergabe></Übergaben><Rückgabe><Typ>str</Typ><Wert>'ollah'</Wert></Rückgabe></Black-Box-Diagramm>

Entwickle eine Funktionsdefinition und teste sie gründlich.

Aufgabe 8: Einen Text verschlüsseln

Entwickle jetzt eine Funktionsdefinition für die Funktion verschluesselterText. orientiere dich an dem oben beschriebenen Algorithmus.

<Black-Box-Diagramm><Funktionsname>verschluesselterText</Funktionsname><Übergaben><Übergabe><Wert>'heuteabdersechtenstundehitzefrei'</Wert><Variable>text</Variable><Typ>str</Typ></Übergabe><Übergabe><Wert>6</Wert><Variable>blocklaenge</Variable><Typ>int</Typ></Übergabe></Übergaben><Rückgabe><Typ>str</Typ><Wert>'aetueh esredb snethc hednut rfezti ie'</Wert></Rückgabe></Black-Box-Diagramm>

Aufgabe 9: Einen Text entschlüsseln

Entwickle eine Funktionsdefinition zur Entschlüsselung von Texten, die mit dem beschriebenen Verfahren verschlüsselt wurden.

X

Fehler melden

X

Suche