Im Folgenden ist ein wesentlicher Angriff auf das RSA-Verfahren implementiert, der Low-Exponent-Angriff zur Entschlüsselung eines Klartextes m.
Der Exponent e des öffentlichen Schlüssels darf nicht zu klein sein, z.B. nicht e=3. Denn sonst ist unter bestimmten Voraussetzungen ein Low-Exponent-Angriff möglich.
Wird nämlich derselbe Klartext m an 3 verschiedene Empfänger geschickt, deren öffentliche Schlüssel (n, e) folgendermaßen lauten: (n0, 3), (n1, 3) und (n2, 3), und werden die entsprechenden Geheimtexte c0, c1 und c2 abgefangen, dann lässt sich mithilfe des chinesischen Restsatzes der Klartext m berechnen.
Denn es gilt
m3 ≡ c0 (mod n0)
m3 ≡ c1 (mod n1)
m3 ≡ c2 (mod n2)
Der chinesische Restsatz liefert dann eine eindeutige Lösung modulo n0·n1·n2 für m3. Durch Ziehen der dritten Wurzel ergibt sich der Klartext m.
In der folgenden Implementierung wird zunächst die Ausgangssituation hergestellt (Funktion generateProblem). Es werden e RSA-Moduln ni der Bitlänge r erzeugt, dann wird ein zufälliger Klartext m gewählt und jeweils mit (ni, e) verschlüsselt, und dann werden die entstandenen Geheimtexte ci "abgefangen".
Bei der Erzeugung der RSA-Moduln ni wird dabei darauf geachtet, dass diese paarweise teilerfremd sind, und ferner, dass die jeweiligen φ(ni) mit dem Exponenten e teilerfremd sind. Bei sehr großen Zahlen ist dies selbstverständlich, da es hochgradig unwahrscheinlich ist, wenn es nicht so wäre. Aber wir probieren das Programm ja zunächst mit kleineren Zahlenbeispielen aus, und daher ist diese Überprüfung erforderlich.
Es stehen somit am Ende eine Liste von e Moduln ni und eine Liste von e Resten ci als geeignete Eingabe für den Chinesischen-Restsatz-Algorithmus zur Verfügung. In der Funktion lowExponentAttack wird der Low-Exponent-Angriff durchgeführt.
Für das Ziehen der n-ten Wurzel aus einer ganzzahligen, sehr großen Kubikzahl ist ein eigener Algorithmus vorgesehen (Funktion nthRoot).
RsaLowExponentAttack.py
Weiter mit: [up]