Station - Sicherheit und die Berechnung des modularen Inversen
Sicherheit des Verfahrens mit modularer Multiplikation
Ist das Verfahren mit modularer Multiplikation sicher? Die Antwort auf diese Frage hängt davon ab, ob man aus dem öffentlichen Schüssel (e, n) direkt den privaten Schlüssel (d, n) berechnen kann. Das soll im Folgenden ausprobiert werden. Die erforderlichen Rechnungen können dabei mit geeigneten Python-Funktionen durchgeführt werden.
Aufgabe 1: Das modulare Inverse berechnen
Zur Berechnung des modularen Inversen kannst du die folgende Funktion benutzen:
def modInv(e, n):
gefunden = False
d = 1
while d <= n and not gefunden:
if (e * d) % n == 1:
gefunden = True
else:
d = d + 1
if d > n:
d = -1
return d
Das Python-Protokoll zeigt, wie man ihn nutzen kann:
>>> modInv(16, 33)
31
Teste die Funktion mit weiteren selbst gewählten Beispielen. Überprüfe auch die Richtigkeit der Ergebnisse.
Aufgabe 2: Geheimcodes knacken
Kannst du mit den bereitgestellten Mitteln die hier zusammengesellten Geheimcodes knacken?
(a) Folgende Informationen sind bekannt: Der Quelltext wurde mit unserem Codierverfahren in Zahlen umgewandelt. Dabei wurde eine Blocklänge 1 benutzt. Der öffentliche Schlüssel ist (16, 33). Mit diesem öffentlichen Schlüssel wurde der Geheimcode [24, 12, 15, 29, 23, 12, 13] erzeugt. Kannst du den Geheimcode entschlüsseln?
(b) Folgende Informationen sind bekannt: Der Quelltext wurde mit unserem Codierverfahren in Zahlen umgewandelt. Dabei wurde eine Blocklänge 2 benutzt. Der öffentliche Schlüssel ist (781, 2828). Mit diesem öffentlichen Schlüssel wurde der Geheimcode [1893, 236, 1973, 1292, 1077, 2028, 2431] erzeugt. Kannst du den Geheimcode entschlüsseln?
(c) Folgende Informationen sind bekannt: Der Quelltext wurde mit unserem Codierverfahren in Zahlen umgewandelt. Dabei wurde eine Blocklänge 3 benutzt. Der öffentliche Schlüssel ist (1237, 1000001). Mit diesem öffentlichen Schlüssel wurde der Geheimcode [432277] erzeugt. Kannst du den Geheimcode entschlüsseln?
(d) Folgende Informationen sind bekannt: Der Quelltext wurde mit unserem Codierverfahren in Zahlen umgewandelt. Dabei wurde eine Blocklänge 27 benutzt. Der öffentliche Schlüssel ist (49 , 1000010000100001000010000100001000010000100001000010000). Mit diesem öffentlichen Schlüssel wurde der Geheimcode [62883925640798254290345343248925177037799997999980000] erzeugt. Kannst du den Geheimcode entschlüsseln?
Aufgabe 3: Laufzeitverhalten der Funktion modInv
(a)
Bestimme das modulare Inverse von a = 775517959261225265313877628572204089387832653836742449
bzgl. des Moduls n = 1000010000100001000010000100001000010000100001000010000 mit Hilfe der
Funktion modInv
. Zur Kontrolle: Es müsste b = 49 herauskommen.
(b) Bestimme mit dem Resultat aus (a) das modulare Inverse von b = 49
bzgl. des Moduls n = 1000010000100001000010000100001000010000100001000010000.
Bestimme anschließend das gesuchte modulare Inverse mit der
Funktion modInv
.
Welches Problem tritt hier auf? Hast du eine Vermutung, warum dieses Problem auftritt.
(c) Hier soll ebenfalls das modulare Inverse von b = 49 bzgl. des Moduls n = 1000010000100001000010000100001000010000100001000010000 bestimmt werden. Die oben vorgegebene Funktion ist hier um Ausgaben ergänzt worden. Nach jeweils 10 Millionen getesteten Zahlen wird eine Ausgabe auf dem Bildschirm erzeugt.
def modInvMitAusgaben(e, n):
gefunden = False
d = 1
while d <= n and not gefunden:
if d % 10000000 == 0:
print("Anzahl der Versuche: ", d)
if (e * d) % n == 1:
gefunden = True
else:
d = d + 1
if d > n:
d = -1
return d
Python-Protokoll:
>>> modInvMitAusgaben(49, 1000010000100001000010000100001000010000100001000010000)
Anzahl der Versuche: 10000000
Anzahl der Versuche: 20000000
Anzahl der Versuche: 30000000
...
Probiere das selbst einmal aus.
Miss (ungefähr) die Zeit, die zwischen zwei Ausgaben verstreicht.
Mit dieser Zeit kannst du jetzt eine Art Hochrechnung
machen, wie lange man in etwa warten muss,
bis das Ergebnis 775517959261225265313877628572204089387832653836742449 berechnet ist.
Beurteile mit den gewonnenen Erkenntnissen die Sicherheit des Verfahrens mit modularer Multiplikation.