Entschuldigungen per Schul-App
AFB I–IIDie Schul-App eines Gymnasiums ersetzt die Entschuldigungszettel: Erziehungsberechtigte schicken Entschuldigungen digital an die Klassenlehrkraft. Damit niemand – auch kein Kind – eine Entschuldigung fälschen oder nachträglich ändern kann, signiert die App auf dem Handy der Eltern jede Entschuldigung mit einem RSA-Schlüsselpaar und SHA-256. Die öffentlichen Schlüssel der Eltern wurden beim ersten Elternabend registriert.
- Nennen Sie drei Eigenschaften einer kryptografischen Hashfunktion, die für digitale Signaturen wichtig sind.
- Zeichnen Sie ein Ablaufschema, das zeigt, wie eine Entschuldigung von Frau Brandt signiert und von der Schul-App geprüft wird. Kennzeichnen Sie die verwendeten Schlüssel.
- Überprüfen Sie die Aussage eines Elternvertreters: „Weil die Entschuldigungen signiert sind, kann niemand außer der Klassenlehrkraft lesen, warum mein Kind gefehlt hat.“
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
- feste Länge: Der Hashwert hat unabhängig von der Textlänge immer dieselbe Länge (SHA-256: 256 Bit).
- Lawineneffekt: Schon eine winzige Änderung des Textes ergibt einen völlig anderen Hashwert.
- Einwegeigenschaft: Aus dem Hashwert lässt sich der Text praktisch nicht zurückberechnen.
- Kollisionsresistenz: Es ist praktisch unmöglich, zwei verschiedene Texte mit gleichem Hashwert zu finden.
Drei der vier Eigenschaften genügen.
Erwartungshorizont zu Aufgabe b)
Wesentlich: Signiert wird mit dem privaten Schlüssel von Frau Brandt, geprüft mit ihrem öffentlichen Schlüssel; die App berechnet den Hashwert des empfangenen Textes selbst und vergleicht.
Erwartungshorizont zu Aufgabe c)
Die Aussage ist falsch. Eine Signatur sichert Integrität (Text unverändert), Authentizität (stammt von Frau Brandt) und Nichtabstreitbarkeit. Der Text der Entschuldigung selbst wird dabei nicht verschlüsselt; wer die Übertragung oder den Server mitliest, kann den Grund des Fehlens lesen. Auch die Signatur verrät nichts Geheimes – sie lässt sich mit dem öffentlichen Schlüssel von jedem „entschlüsseln“.
Damit die Aussage stimmt, müsste die Entschuldigung zusätzlich vertraulich übertragen werden, z. B. hybrid: Text mit einem Sitzungsschlüssel verschlüsseln, diesen mit dem öffentlichen Schlüssel der Klassenlehrkraft. Sinnvoll ist: erst signieren, dann verschlüsseln.
Ein Signatur-Prototyp mit Schwachstelle
AFB II–IIIDie Informatik-AG will die Signaturfunktion der Schul-App nachbauen, um das Prinzip zu verstehen. Statt SHA-256 und großer RSA-Schlüssel verwendet sie eine selbst geschriebene Hashfunktion und sehr kleine Zahlen (Material M1). In der Oberstufe melden Eltern am Monatsende die Fehlstunden ihres Kindes als signierte Nachricht, z. B. „Fehlstunden: 12“.
N = 2773
E = 17 # öffentlich, beim Elternabend registriert
D = 157 # privat, nur auf dem Handy der Eltern
def hash_wert(text):
summe = 0
for zeichen in text:
summe = summe + ord(zeichen)
return summe % 1000
def signieren(text):
return pow(hash_wert(text), D, N)
ord(z) liefert den Zeichencode von z, pow(a, b, n) den Rest von \(a^b\) bei Division durch \(n\). Beispiel: hash_wert("Fehlstunden: 12") ergibt 341, signieren("Fehlstunden: 12") ergibt 538.- Analysieren Sie den Quelltext in M1 im Hinblick darauf, welche Schritte des Signaturverfahrens umgesetzt sind und welche Rolle
N,EundDspielen. - Erweitern Sie das Programm um eine Funktion
pruefen(text, signatur), die genau dannTruezurückgibt, wenn die Signatur zum Text passt. - Nehmen Sie Stellung zu der Behauptung: „Der Prototyp ist fälschungssicher, weil nur die Eltern
Dkennen.“ Beziehen Sie die Nachricht „Fehlstunden: 21“ ein.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
hash_wert("Fehlstunden: 21") – was fällt auf? Prüfen Sie außerdem, wie viele Hashwerte es überhaupt gibt und wie groß N ist.Stellung nehmen: eigene Position nach Abwägen, begründet mit Fachwissen.Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
hash_wertbildet den Hashwert: Summe der Zeichencodes, Rest bei Division durch 1000 – also ein Wert von 0 bis 999 mit fester „Länge“.signierenverschlüsselt den Hashwert mit dem privaten ExponentenD: \(s = h^D \bmod N\). Das Ergebnis ist die Signatur, die mit dem Text verschickt wird.(N, E)ist der öffentliche Schlüssel der Eltern (zum Prüfen),(N, D)der private (zum Signieren). Da \(h < N\) gilt, geht beim Verschlüsseln nichts verloren.- Es fehlt noch der Prüfschritt auf der Empfängerseite.
Erwartungshorizont zu Aufgabe b)
def pruefen(text, signatur):
h_aus_signatur = pow(signatur, E, N)
return h_aus_signatur == hash_wert(text)
print(pruefen("Fehlstunden: 12", 538)) # True
print(pruefen("Fehlstunden: 2", 538)) # False
Kontrolle: \(538^{17} \bmod 2773 = 341\) = hash_wert("Fehlstunden: 12"). Die Funktion braucht nur öffentliche Werte.
Erwartungshorizont zu Aufgabe c)
Was für die Behauptung spricht: Das Prinzip ist richtig – ohne D kann man zu einem neuen Hashwert keine passende Signatur berechnen.
Was dagegen spricht:
- Kollisionen sind trivial:
hash_wertaddiert nur Zeichencodes, die Reihenfolge ist egal. „Fehlstunden: 21“ hat dieselben Zeichen wie „Fehlstunden: 12“, also ebenfalls den Hashwert 341 und damit dieselbe Signatur 538. Ein Kind kann aus der von den Eltern signierten Meldung „21“ die Meldung „12“ machen –pruefenliefertTrue. - Es gibt nur 1000 Hashwerte; passende Texte lassen sich auch sonst leicht durch Probieren finden.
- \(N = 2773 = 47 \cdot 59\) ist sofort faktorisierbar, daraus folgt
D.
Position: Der Prototyp ist nicht fälschungssicher. Die Geheimhaltung von D nützt nichts, wenn die Hashfunktion keine Kollisionsresistenz hat. Nötig sind eine kryptografische Hashfunktion (SHA-256) und ausreichend lange Schlüssel (RSA mit mindestens 3072 Bit).
