MINT lernen

Digitale Signaturen

Zwei Aufgaben zu Hashwerten und Signaturen – von der digitalen Entschuldigung bis zum Nachbau in Python.

Dein Fortschritt:
0 / 0 Aufgaben
1

Entschuldigungen per Schul-App

AFB I–II

Die 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.

  1. Nennen Sie drei Eigenschaften einer kryptografischen Hashfunktion, die für digitale Signaturen wichtig sind.
  2. 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.
  3. Ü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)
Denken Sie an die Länge des Ergebnisses, an die Wirkung kleiner Änderungen und an die Umkehrbarkeit.
Hinweis zu Aufgabe b)
Teilen Sie das Schema in Absender und Empfänger. Der Empfänger bildet zwei Hashwerte auf verschiedenen Wegen und vergleicht sie.Zeichnen: übersichtliche Grafik mit Beschriftung – Kästen und Pfeile genügen.
Hinweis zu Aufgabe c)
Welche Schutzziele erfüllt eine Signatur, welche nicht? Was müsste zusätzlich geschehen, damit die Aussage stimmt?

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)
Eltern-Handy (Absender)Text der EntschuldigungHashfunktionHashwert hverschlüsseln mit demprivaten Schlüssel der ElternSignatur sübertragen: Text + sSchul-App (Empfänger)TextHashfunktionh′ (selbst berechnet)Signatur sentschlüsseln mit öff.Schlüssel der Elternh (aus Signatur)Vergleich: h = h′ ?gleich → gültigungleich → ungültig

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.

2

Ein Signatur-Prototyp mit Schwachstelle

AFB II–III

Die 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“.

M1Prototyp der Informatik-AG (Python)
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.
  1. Analysieren Sie den Quelltext in M1 im Hinblick darauf, welche Schritte des Signaturverfahrens umgesetzt sind und welche Rolle N, E und D spielen.
  2. Erweitern Sie das Programm um eine Funktion pruefen(text, signatur), die genau dann True zurückgibt, wenn die Signatur zum Text passt.
  3. Nehmen Sie Stellung zu der Behauptung: „Der Prototyp ist fälschungssicher, weil nur die Eltern D kennen.“ Beziehen Sie die Nachricht „Fehlstunden: 21“ ein.

Hinweise

Hinweis zu Aufgabe a)
Welche Funktion bildet den „Fingerabdruck“, welche verschlüsselt ihn? Welcher Exponent wird dabei benutzt – und welcher würde zum Prüfen gebraucht?
Hinweis zu Aufgabe b)
Beim Prüfen wird die Signatur mit dem öffentlichen Exponenten „entschlüsselt“ und mit dem selbst berechneten Hashwert verglichen.
Hinweis zu Aufgabe c)
Berechnen Sie 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_wert bildet den Hashwert: Summe der Zeichencodes, Rest bei Division durch 1000 – also ein Wert von 0 bis 999 mit fester „Länge“.
  • signieren verschlüsselt den Hashwert mit dem privaten Exponenten D: \(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_wert addiert 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 – pruefen liefert True.
  • 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).