Aufgabe 2 - Datenschutz und Datensicherheit · Abitur NRW Informatik LK · Nachtermin 2023
Thema: Datenschutz und Datensicherheit · Aus der Prüfung LK · Nachtermin (2023)
Aufgabenstellung
Aufgabenstellung
Ein Informatikkurs hat selbst eine Methode zur Verschlüsselung von Nachrichten entworfen: Jeder Buchstabe des Alphabets wird durch eine Folge aus Nullen und Einsen ersetzt (nachfolgend „Chiffre“ genannt). Die Länge dieser Chiffre kann variieren. Der Einfachheit halber werden in der Aufgabe nur die sieben Buchstaben A, E, H, L, O, T und W betrachtet.
Um ein fehlerfreies Ver- und Entschlüsseln zu gewährleisten, bilden sie die Chiffren der Buchstaben nach diesem Prinzip:
Genau ein Buchstabe gehört zu jedem Blatt eines Binärbaums. Von der Wurzel aus wird untersucht, ob der Weg zum gesuchten Buchstaben in den linken oder in den rechten Teilbaum führt. Der Weg in den linken Teilbaum wird mit 0, der in den rechten Teilbaum mit 1 codiert. Die Nullen und Einsen werden vereinfachend als Zeichenketten abgelegt.
Ein solcher Baum legt eindeutig fest, welche Chiffre zu welchem Buchstaben gehört. Da das Verfahren den Baum nicht vorgibt, ergeben verschiedene Bäume verschiedene Chiffren. Der Baum stellt somit den Schlüssel dar.
Jedem Buchstaben ist eine eigene Chiffre zugeordnet. Man kann alle Chiffren in einer Tabelle sammeln. Zum Schlüssel-Beispiel aus Abbildung 1 erhält man die folgende unvollständige Chiffrier-Tabelle:
Buchstabe · A · O · T · E · W · L · H
Chiffre · · · · · · 1101
Abbildung 2: unvollständige Chiffrier-Tabelle zum Beispiel aus Abbildung 1
Zur Nutzung dieses Verschlüsselungssystems wurde ein Softwaremodell entwickelt, das ausschnittsweise so dargestellt ist:
Anhang: Dokumentationen der verwendeten Klassen
Die Klasse Chiffrierer
Ein Objekt der Klasse Chiffrierer verwaltet die Entschlüsselung und Verschlüsselung von Zeichenketten mittels eines Binärbaums und einer Tabelle.
Ausschnitt aus der Dokumentation der Klasse Chiffrierer
Chiffrierer()
Ein Objekt der Klasse existiert, es ist nicht initialisiert. Eine Chiffrier-Tabelle und ein Chiffrier-Baum existieren nicht, das Entschlüsseln und das Verschlüsseln sind noch nicht möglich.
void initialisiere(Schluessel pSchluessel, String pPasswort)
Wenn das übergebene Passwort zum übergebenen Schlüssel passt, werden mit diesen Parametern der Chiffrier-Baum und die Chiffrier-Tabelle initialisiert. Das Entschlüsseln und das Verschlüsseln sind dann möglich.
String verschluessele(String pKlartext)
Sofern das Chiffrierer-Objekt korrekt initialisiert ist, nicht null übergeben wird und die Verschlüsselung gelingt, wird der übergebene Klartext verschlüsselt und der entsprechende Geheimtext zurückgegeben.
String entschluessele(String pGeheimtext)
Sofern das Chiffrierer-Objekt korrekt initialisiert ist, nicht null übergeben wird und die Entschlüsselung gelingt, wird der übergebene Geheimtext entschlüsselt und der entsprechende Klartext zurückgegeben.
Dokumentation privater Methoden der Klasse Chiffrierer
void erstelleChiffrierTabelle()
Diese Methode soll in Teilaufgabe c) analysiert werden.
void ermittleChiffrierTabelle(BinaryTree<String> pBaum, String pChiffre)
Diese Methode soll in Teilaufgabe c) analysiert werden.
String entschluesseleBuchstaben(String pChiffre)
Sofern das Chiffrierer-Objekt korrekt initialisiert ist, wird der Klarbuchstabe zu der übergebenen Chiffre zurückgegeben. Andernfalls wird null zurückgegeben. Die Chiffre wird nicht auf Korrektheit geprüft.
Die Klasse Schluessel
Ein Objekt der Klasse verwaltet einen Chiffrier-Baum sowie den Zugriff auf den Chiffrier-Baum über ein Passwort.
Ausschnitt aus der Dokumentation der Klasse Schluessel
Schluessel(String pPasswort, BinaryTree<String> pChiffrierBaum)
Ein neues Objekt der Klasse wird mit den übergebenen Parametern initialisiert. Das Passwort wird nicht im Klartext gespeichert sondern ein Prüfwert.
BinaryTree<String> gibChiffrierBaum(String pPasswort)
Sofern das Passwort korrekt ist, wird eine Referenz auf den gespeicherten Chiffrier-Baum zurückgegeben. Andernfalls wird null zurückgegeben.
Dokumentation privater Methoden der Klasse Schluessel
boolean pruefePasswort(String pPasswort)
Die Methode liefert true, wenn die Zeichenkette pPasswort dem beim Erzeugen des Objekts übergebenen Passwort entspricht. Andernfalls liefert sie false.
Die Klasse ChiffrierTabelle
Ein Objekt der Klasse verwaltet die Chiffren zu den Buchstaben analog zum Chiffrier-Baum.
Ausschnitt aus der Dokumentation der Klasse ChiffrierTabelle
ChiffrierTabelle()
Ein neues Objekt der Klasse wird initialisiert. Es ist keine Kombination aus Buchstabe und Chiffre gespeichert.
void fuegeHinzu(String pBuchstabe, String pChiffre)
Die Kombination aus dem Klartext-Buchstaben und der Chiffre für diesen Buchstaben wird gespeichert. Ist für den Buchstaben bereits eine Chiffre vorhanden, wird die vorhandene gelöscht und die zuletzt übergebene gespeichert.
String gibChiffre(String pBuchstabe)
Sofern für den übergebenen Buchstaben eine Chiffre existiert, wird diese zurückgegeben. Andernfalls wird null zurückgegeben.
Die generische Klasse BinaryTree<ContentType>
Mithilfe der generischen Klasse BinaryTree können beliebig viele Objekte vom Typ ContentType in einem Binärbaum verwaltet werden. Ein Objekt der Klasse stellt entweder einen leeren Baum dar oder verwaltet ein Inhaltsobjekt sowie einen linken und einen rechten Teilbaum, die ebenfalls Objekte der generischen Klasse BinaryTree sind.
Dokumentation der Klasse BinaryTree<ContentType>
BinaryTree<ContentType>()
Nach dem Aufruf des Konstruktors existiert ein leerer Binärbaum.
BinaryTree<ContentType>(ContentType pContent)
Wenn der Parameter pContent ungleich null ist, existiert nach dem Aufruf des Konstruktors der Binärbaum und hat pContent als Inhaltsobjekt und zwei leere Teilbäume. Falls der Parameter null ist, wird ein leerer Binärbaum erzeugt.
BinaryTree<ContentType>(ContentType pContent, BinaryTree<ContentType> pLeftTree, BinaryTree<ContentType> pRightTree)
Wenn der Parameter pContent ungleich null ist, wird ein Binärbaum mit pContent als Inhaltsobjekt und den beiden Teilbäume pLeftTree und pRightTree erzeugt. Sind pLeftTree oder pRightTree gleich null, wird der entsprechende Teilbaum als leerer Binärbaum eingefügt. Wenn der Parameter pContent gleich null ist, wird ein leerer Binärbaum erzeugt.
boolean isEmpty()
Diese Anfrage liefert den Wahrheitswert true, wenn der Binärbaum leer ist, sonst liefert sie den Wert false.
void setContent(ContentType pContent)
Wenn der Binärbaum leer ist, wird der Parameter pContent als Inhaltsobjekt sowie ein leerer linker und rechter Teilbaum eingefügt. Ist der Binärbaum nicht leer, wird das Inhaltsobjekt durch pContent ersetzt. Die Teilbäume werden nicht geändert. Wenn pContent null ist, bleibt der Binärbaum unverändert.
ContentType getContent()
Diese Anfrage liefert das Inhaltsobjekt des Binärbaumes. Wenn der Binärbaum leer ist, wird null zurückgegeben.
void setLeftTree(BinaryTree<ContentType> pTree)
Wenn der Binärbaum leer ist, wird pTree nicht angehängt. Andernfalls erhält der Binärbaum den übergebenen Baum als linken Teilbaum. Falls der Parameter null ist, ändert sich nichts.
void setRightTree(BinaryTree<ContentType> pTree)
Wenn der Binärbaum leer ist, wird pTree nicht angehängt. Andernfalls erhält der Binärbaum den übergebenen Baum als rechten Teilbaum. Falls der Parameter null ist, ändert sich nichts.
BinaryTree<ContentType> getLeftTree()
Diese Anfrage liefert den linken Teilbaum des Binärbaumes. Der Binärbaum ändert sich nicht. Wenn der Binärbaum leer ist, wird null zurückgegeben.
BinaryTree<ContentType> getRightTree()
Diese Anfrage liefert den rechten Teilbaum des Binärbaumes. Der Binärbaum ändert sich nicht. Wenn der Binärbaum leer ist, wird null zurückgegeben.
Die Klasse String
Ein Objekt der Klasse String kann eine Zeichenkette, die eine URL repräsentieren soll, auf Korrektheit geprüft werden.
Ausschnitt aus der Dokumentation der Klasse String
char charAt(int index)
Die Methode liefert das Zeichen an dem angegebenen Index index. Der Index reicht von 0 einschließlich bis zur length() - 1. Das erste Zeichen besitzt den Index 0, das nächste den Index 1 und so weiter.
int compareTo(String anotherString)
Die Methode vergleicht zwei Zeichenketten lexikografisch. Sie liefert einen Integerwert kleiner als 0, wenn der String lexikografisch vor der übergebenen Zeichenkette anotherString anzuordnen ist. Sie liefert einen Integerwert größer als 0, wenn der String lexikografisch nach der der übergebenen Zeichenkette anotherString anzuordnen ist. Sind beide Zeichenketten identisch, wird der Wert 0 zurückgegeben.
boolean equals(Object anObject)
Die Methode liefert genau dann true, wenn der Parameter anObject nicht null ist und wenn das übergebene Objekt anObject vom Typ String ist und die gleiche Zeichenkette repräsentiert.
int indexOf(String str)
Die Methode liefert den Index des ersten Zeichens beim ersten Vorkommen der übergebenen Zeichenkette str. Kommt die übergebene Zeichenkette nicht vor, wird -1 zurückgegeben.
int length()
Die Methode liefert die Länge der Zeichenkette.
boolean startsWith(String prefix)
Die Methode liefert genau dann den Wert true, wenn die Zeichenkette mit dem angegebenen Präfix prefix beginnt. Andernfalls liefert sie den Wert false. Wird eine leere Zeichenkette oder die identische Zeichenkette übergeben, liefert die Methode dementsprechend ebenfalls den Wert true.
String substring(int beginIndex)
Die Methode liefert einen Teil der Zeichenkette. Dieser Teil beginnt mit dem übergebenen Index beginIndex und reicht bis zum Ende der Zeichenkette. Der Wert des Parameters beginIndex darf nicht größer als die Länge der Zeichenkette sein. Ist er gleich der Länge der Zeichenkette, so wird die leere Zeichenkette "" zurückgegeben.
String substring(int beginIndex, int endIndex)
Die Methode liefert einen Teil der Zeichenkette. Dieser Teil beginnt mit dem übergebenen Index beginIndex und reicht bis ein Zeichen vor endIndex. Der Wert des Parameters endIndex darf nicht größer als die Länge des Strings sein. Der Wert des Parameters beginIndex muss größer oder gleich 0 sein und darf nicht größer als der Wert von endIndex sein.
a)
Der in Abbildung 1 als Chiffrier-Baum abgebildete Schlüssel dient dazu, Klartexte zu verschlüsseln und Geheimtexte wieder zu entschlüsseln.
Vervollständigen Sie die in Abbildung 2 gegebene Chiffrier-Tabelle.
Buchstabe · A · O · T · E · W · L · H
Chiffre · · · · · · 1101
Ermitteln Sie sowohl den Geheimtext für den Klartext als auch den Klartext für den Geheimtext .
Erläutern Sie allgemein, wie ein einzelner Buchstabe verschlüsselt und eine einzelne Chiffre entschlüsselt wird, und zwar jeweils mithilfe eines Chiffrier-Baums und mithilfe einer Chiffrier-Tabelle.
b)
Erläutern Sie mithilfe von Abbildung 3 und der Dokumentationen im Anhang, auf welche grundlegende Weise der direkte Zugriff auf den Chiffrier-Baum in der Klasse Schluessel geschützt wird.
e)
Passwortgeschützte Informationen lassen sich mit modernen Informatiksystemen angreifen, etwa indem automatisiert sehr viele mögliche Passwörter systematisch durchprobiert werden.
Die Klasse Schluessel soll so erweitert werden, dass ein derartiger Angriff durch Ausprobieren des Passworts auf den geschützten Chiffrier-Baum praktisch nicht mehr durchführbar ist. Bei bereits vorhandenen Schlüsseln soll dafür keine Passwortänderung erforderlich sein.
Entwickeln Sie eine Strategie, mit der der Chiffrier-Baum gegen einen solchen Angriff geschützt wird.
Modellieren Sie Ihre Strategie als Erweiterung der Klasse Schluessel (vgl. Abbildung 3) und stellen Sie die erweiterte Klasse in Form eines Implementationsdiagramms dar.
Erläutern Sie, auf welche Weise Ihre Modellierung die Strategie umsetzt.

Lösung
Nach den offiziellen Korrekturhinweisen
Chiffre für Buchstabe A
Lösung: 000
Chiffre für Buchstabe O
Lösung: 001
Chiffre für Buchstabe T
Lösung: 01
Chiffre für Buchstabe E
Lösung: 10
Chiffre für Buchstabe W
Lösung: 1100
Chiffre für Buchstabe H
Lösung: 111
Ermitteln Sie den Geheimtext zum Klartext k1 = "WELT".
Lösung: 110010110101
Ermitteln Sie den Klartext zum Geheimtext g2 = "11100011011101001".
Lösung: HALLO
Erläutern Sie allgemein, wie ein einzelner Buchstabe verschlüsselt und eine einzelne Chiffre entschlüsselt wird, und zwar jeweils mithilfe eines Chiffrier-Baums und mithilfe einer Chiffrier-Tabelle.
Lösung: Das Verschlüsseln lässt sich mit dem Chiffrier-Baum durchführen, indem im Baum zunächst der zu verschlüsselnde Buchstabe des Klartextes gesucht wird. Der Pfad von der Wurzel zum Buchstaben in dieser Reihenfolge ergibt die Chiffre: Für jeden Abstieg in den linken Teilbaum wird eine 0 notiert, für jeden Abstieg in den rechten Teilbaum eine 1. Das Entschlüsseln einer Chiffre lässt sich mit dem Chiffrier-Baum anhand des Abstiegs entlang eines festgelegten Pfades im Baum bewerkstelligen: Man steigt jeweils anhand der jeweiligen Ziffern der Chiffre entweder bei einer 0 im linken Teilbaum oder bei einer 1 im rechten Teilbaum ab, bis man ein Blatt erreicht hat. In dem Blatt ist der Buchstabe des Klartextes vermerkt. Verwendet man für das Verschlüsseln die Chiffrier-Tabelle, so muss der passende Buchstabe in der Tabelle gesucht werden, um so die Chiffre des Klartextes zu erhalten. Das Entschlüsseln funktioniert ebenso.
b) Erläutern Sie mithilfe von Abbildung 3 und der Dokumentationen im Anhang, auf welche grundlegende Weise der direkte Zugriff auf den Chiffrier-Baum in der Klasse Schluessel geschützt ist.
Lösung: Für den Schutz des Chiffrier-Baums in einem Objekt der Klasse Schluessel ist hier als grundlegender (aber nicht ausreichender) Schutz die Idee der Kapselung und ein Passwortschutz wesentlich: Beim Erzeugen eines Objekts der Klasse Schluessel mit dem einzigen Konstruktor wird ein Passwort übergeben, das in Form eines Prüfwerts in einem privaten Attribut verwaltet wird. Es kann also von Objekten anderer Klassen nicht ausgelesen werden, da auch keine passende Methode zur Anfrage dieses Prüfwertes existiert. Ebenfalls beim Erzeugen eines Objekts dieser Klasse wird der Chiffrier-Baum übergeben, der auch in einem privaten Attribut verwaltet wird. Um an den Chiffrier-Baum zu gelangen, kann allerdings die Methode gibChiffrierBaum verwendet werden. Diese gibt laut Dokumentation nur dann eine Referenz auf den verwalteten Chiffrier-Baum zurück, wenn das als Parameter übergebene Passwort korrekt ist. Das Passwort wie die Referenz auf den Chiffrier-Baum können für die Lebenszeit des Objekts nicht verändert werden.
e) Entwickeln Sie eine Strategie, mit der der Chiffrier-Baum gegen einen solchen Angriff geschützt wird.
Lösung: Eine Möglichkeit, das automatisierte Ausprobieren einer großen Anzahl von möglichen Passwörtern zu verhindern, ist die Begrenzung der zulässigen Fehlversuche in Folge. So kann ein Schlüssel beispielsweise deaktiviert werden, wenn dreimal in Folge ein falsches Passwort eingegeben wurde. Ist ein Schlüssel deaktiviert, kann der Chiffrier-Baum nicht mehr ausgelesen werden.
e) Modellieren Sie Ihre Strategie als Erweiterung der Klasse Schluessel (vgl. Abbildung 3) und stellen Sie die erweiterte Klasse in Form eines Implementationsdiagramms dar.
Lösung: Erweiterung der Klasse `Schluessel`: - Neue bzw. ergänzte Attribute: - `-maxFehlversuche: int` - `-fehlversuche: int` - Konstruktor und Methoden: - `+Schluessel(pPasswort: String, pChiffrierBaum: BinaryTree<String>, pMaxFehlversuche: int)` - `+gibChiffrierBaum(pPasswort: String): BinaryTree<String>` - `-pruefePasswort(pPasswort: String): boolean` - `+istDeaktiviert(): boolean`
e) Erläutern Sie, auf welche Weise Ihre Modellierung die Strategie umsetzt.
Lösung: Durch das Festlegen der maximalen Fehlversuche im Konstruktor kann der Wert des Attributs maxFehlversuche einmalig auf einen positiven Wert gesetzt und dann von außen nicht mehr direkt verändert werden. Wird nun die Methode pruefePasswort mit einem falschen Passwort aufgerufen, wird der Wert des mit 0 initialisierten Attributs fehlversuche um 1 erhöht – sofern der Wert von fehlversuche nicht bereits größer ist als zulässig. In diesem Fall wird das Passwort nicht geprüft und direkt false zurückgegeben. Wird das richtige Passwort übergeben, wird der Wert von fehlversuche wieder auf 0 gesetzt. Wird der Wert von fehlversuche erstmalig überschritten, kann die Referenz zum Chiffrier-Baum auf null gesetzt werden. Mit der Methode istDeaktiviert kann geprüft werden, ob das Objekt deaktiviert ist, also die Anzahl der Fehleingaben nacheinander das Maximum überschritten hat.
Die ausführliche Erklärung Schritt für Schritt (mit KI) gibt es mit Premium. Premium
Löse sie direkt hier: automatische Korrektur, Hinweise und Lösung Schritt für Schritt.
Aufgabe 1 - Datenschutz und Datensicherheit · GK · Haupttermin 2022 ›
Mehr Aufgaben zu Datenschutz und Datensicherheit
- Aufgabe 1 - Datenschutz und Datensicherheit · GK · Haupttermin 2022
- Aufgabe 2 - Datenschutz · GK · Nachtermin 2022
- Aufgabe 3 - Datenschutz · GK · Nachtermin 2022
- Aufgabe 1 - Datenschutz · LK · Haupttermin 2022
- Aufgabe 2 - Datenschutz · LK · Nachtermin 2022
- Aufgabe 3 - Datenschutz · LK · Nachtermin 2022
- Aufgabe 3 - Datenschutz und Datensicherheit · GK · Haupttermin 2021
- Aufgabe 3 - Datenschutz · GK · Haupttermin · Weiterbildungskolleg 2021
- Aufgabe 2 - Datenschutz und Datensicherheit · GK · Nachtermin 2021
- Aufgabe 3 - Datenschutz und Datensicherheit · LK · Haupttermin 2021