Das Unknackbare knacken: Der Shor-Algorithmus
Übersicht
Auf einen Blick
Schlüsselbegriffe: Verschlüsselung, Entschlüsselung, Modulo‑Arithmetik, Klartext, Geheimtext, modulare Exponentiation, Toffoli‑Gatter, Hadamard‑Gatter, CNOT‑Gatter, NOT‑Gatter, Quanten‑Fourier‑Transformation
Alter: 16–18 Jahre
Vorkenntnisse/Fertigkeiten: Verständnis von Superposition und der Wirkungsweise verschiedener Quantengatter aus vorherigen Unterrichtseinheiten
Zeitumfang: 60 Minuten
Autor: Sam Robbins (UK)
Unterrichtsplan
| Zeit in Minuten | Unterrichtsphase | Aktivität | Material |
|---|---|---|---|
| 0–10 | Aufgabe 1 | Einführung und anschließende Übung zur Bestimmung der Periode der Potenzen von 62 (mod 77) | Arbeitsblatt, Python Interpreter |
| 10–20 | Erklärung: Wie Perioden RSA brechen können | Lehrkraft erklärt, wie aus Chiffretexten Perioden bestimmt und zum Brechen von RSA genutzt werden können | Arbeitsblatt, Python Interpreter |
| 20–25 | Erklärung des Quanten-Schaltkreises für modulare Exponentiation | Lehrkraft demonstriert den Aufbau des Schaltkreises zur Implementation der modularen Exponentialfunktion (z. B. im Quatum composer) | Arbeitsblatt, Quantum Composer (z. B. IBM Quantum Composer) |
| 25–45 | Aufgabe 2 | Schülerinnen und Schüler implementieren die modulare Exponentialfunktion | Arbeitsblatt, Quantum Composer (z. B. IBM Quantum Composer) |
| 45–50 | Erklärung der vollständigen Schaltung von Shors Algorithmus | Lehrkraft zeigt die vollständige Schaltung und erklärt, wie daraus die Periode bestimmt wird | Arbeitsblatt, Quantum Composer (z. B. IBM Quantum Composer) |
| 50–60 | Aufgabe 3 | Schülerinnen und Schüler bestimmen d′ mithilfe der Periode und zeigen, dass RSA für pq=15 gebrochen wurde | Arbeitsblatt, Taschenrechner |
Je nach verfügbarer Zeit und Geschwindigkeit der Schüler:innen kann die Lektion auch auf zwei Schulstunden aufgeteilt werden.
Aufgaben und Hinweise für Lehrkräfte
In dieser Lektion betrachten wir, wie ein von Peter Shor im Jahr 1994 entwickelter Quantenalgorithmus verwendet werden kann, um die RSA-Verschlüsselung zu knacken. Obwohl Quantencomputer derzeit noch nicht leistungsfähig genug sind, hat Shors Algorithmus bereits eine Revolution in der Kryptographie ausgelöst, um sicherzustellen, dass die Internetverschlüsselung auch in Zukunft sicher bleibt.
Arbeitsblatt
Die folgenden Aufgaben können Sie als Arbeitsblatt in pdf oder docx herunterladen.
Die Aufgaben sind auch als interaktives Arbeitsblatt mit eingebetteter Python-Umgebung verfügbar.
Bestimmen einer Periode
Shors Algorithmus nutzt eine Schwachstelle des RSA-Verfahrens aus, die darin besteht, dass modulare Potenzierung periodisch ist. Das bedeutet: Wenn man eine Zahl wiederholt in der Modulo-Arithmetik potenziert, kehrt man irgendwann wieder zur ursprünglichen Zahl zurück und das Muster wiederholt sich.
Potenzieren wir zum Beispiel 2 sukzessive modulo 5 erhalten wir:
Die Folge lautet also: 2, 4, 3, 1, 2, 4, 3, 1, und das Muster setzt sich in diesem Zyklus fort. Die erste Potenz, bei der wir erhalten, legt die Periode des Zyklus, in diesem Fall 4, fest.
Aufgabe 1: Bestimme die Periode einer RSA-Verschlüsselung
In dieser Aufgabe verwenden wir ein RSA-Verfahren mit pq=77 (p=7, q=11) und Verschlüsselungsschlüssel e = 7. Wir nutzen den Code für die modulare Potenz aus der Unterrichtseinheit "RSA: Der unknackbare Code?":
def powerMod(a, b, c): # raises a to the power of b modulo c res = a % c for i in range(0, b - 1): res = a * res % c return res pq = 77 e = 7 a = 13 print(powerMod(a,e,pg))
Wenn wir mit einem Klartext von 13 beginnen, ergibt dies den verschlüsselten Wert 62 (der Geheimtext). Das Ziel beim Brechen von RSA besteht darin, von einem verschlüsselten Wert auszugehen (den man in einem Kommunikationskanal abfangen kann) und seine Periode zu finden. Bestimme mithilfe der modularen Potenz die Periode von 62, d. h. bestimme die erste Potenz von 62, welche ergibt.
Die Schülerinnen und Schüler sollen eine einfache Schleife schreiben, die die Potenzen von berechnet (siehe Programmcode). Der Zyklus endet bei 1, weil 13 und 77 teilerfremd sind.
Lösung:
Die Periode ist 10 und die Potenzen sind [62, 71, 13, 36, 76, 15, 6, 64, 41, 1].
Beispielcode:
def powerMod(a, b, c): # raises a to the power of b modulo c res = a % c for i in range(0, b - 1): res = a * res % c return res pq = 77 a = 62 for i in range(1,11): print(powerMod(a,i,pg))
Wie die Periode hilft, das RSA-Verfahren zu knacken
Wenn wir beispielsweise die Zahl 16 mit e = 7 verschlüsseln, ergibt sich der verschlüsselte Wert 58. 58 hat eine Periode von 15 [die Liste der Potenzen ist 58, 53, 71, 37, 67, 36, 9, 60, 15, 23, 25, 64, 16, 4, 1]. (Beachte: Die Periode endet bei 1, da sich der größte gemeinsame Teiler von 16 und 77 zu 1 ergibt.)
Zwei wichtige mathematische Aussagen über die Periode helfen uns, RSA zu knacken:
- 16 (die Originalnachricht) ist in der Liste der Potenzen von 58.
- 16 hat ebenfalls eine Periode von 15 und die Liste der Potenzen von 16 ergibt dieselben Werte wie die Potenzen von 58, nur in anderer Reihenfolge: [16, 25, 15, 9, 67, 71, 58, 4, 64, 23, 60, 36, 37, 53, 1].
Das bedeutet: Wenn wir die Periode des Geheimtexts kennen, kennen wir auch die des Klartexts. Wir bezeichnen die Periode mit r. Wir bestimmen eine Zahl d’ mit
In unserem Beispiel mit e = 7 and r = 15 können wir d’ = 13 verwenden, da .
Wenn wir das Chiffrat nun mit d’ potenzieren, erhalten wir den ursprünglichen Klartext zurück – nur mit öffentlich zugänglichen Informationen (e und pq). Damit hätten wir den Code gebrochen! Dies lässt sich nachrechnen:
Geheimtext
Damit
Aber da ( )
Und da jede Potenz mit dem Vielfachen der Periode 1 ergibt
Und damit
Verwenden wir unseren Code mit dem Geheimtext 58 und d’=13, finden wir:
Wir haben also den Klartext 16 mit einer Methode gefunden, die keine Kenntnis über die Originalnachricht hat!
Das Auffinden der Periode ist schwer für einen klassischen Computer, da es neben der Periode kein erkennbares Muster in den Potenzen gibt. Ein klassischer Computer müsste daher entweder die Periode raten oder alle Potenzen durchrechnen, bis 1 erreicht wird. Für reale RSA-Zahlen (mit mehreren hundert Stellen) ist das unmöglich in einem praktischen Zeitrahmen auf einem klassischen Computer umsetzbar.
Das Beispiel aus dem Arbeitsblatt kann mithilfe des angegebenen Programmcodes demonstriert werden.
Die wichtigsten Erkenntnisse:
- Ein Klartextzeichen und sein zugehöriges Geheimtextzeichen besitzen dieselbe Periode.
- Die Potenzmengen beider Zeichen enthalten dieselben Zahlen.
def powerMod(a, b, c): # raises a to the power of b modulo c res = a % c for i in range(0, b - 1): res = a * res % c return res pq = 77
plainText = 16
e = 7 cipherText = powerMod(plainText,e,pq) print("PlainText: "+str(plainText))
print("")
print("CipherText: "+str(cipherText))
print("")
print("Powers of Cipher Text")
print("") for i in range(1,16): print (str(cipherText)+"^"+str(i)+" = "+str(powerMod(cipherText,i,pq))+" (mod "+str(pq)+")")
Der mathematische Beweis, warum die Periode zum Brechen von RSA genutzt werden kann, befindet sich im Arbeitsblatt. Der Wert d′ kann mithilfe des Erweiterten euklidischen Algorithmus bestimmt werden. Dies geschieht auf ähnliche Weise wie bei der normalen RSA-Schlüsselerzeugung. Der entscheidende Unterschied hier – und ein zentrales Lernziel der Stunde – ist, dass ein Angreifer d′ allein aus öffentlich verfügbaren Informationen berechnen könnte: dem abgefangenen Chiffretext, der berechneten Periode r und dem öffentlichen Schlüssel (e,pq). Der Angreifer bräuchte also pq nicht faktorisieren, wenn er eine effiziente Methode zur Bestimmung von r besitzt.
Quantencomputer lösen unser Problem!
Für einen klassischen Computer ist das Finden der Periode nicht effizient lösbar. Jedoch gibt es eine geniale Methode zur schnellen Bestimmung einer Periode durch Ausnutzen der Quanten-Fourier-Transformation. Diese wird im Shor-Algorithmus verwendet:
- Wir implementieren die modulare Potenz in einem Schaltkreis aus Quantengattern. Dabei muss die Anzahl der Qubits groß genug sein, um die Größe der RSA-Zahl (pq) zu kodieren;
- Wir wenden auf jedes Input-Qubit ein Hadamard Gatter an, um eine gleichgewichtete Superposition aller Basiszustände zu erhalten (dies ist die gleiche Strategie wie bei den Quanten-Algorithmen aus den anderen Lektionen) und wenden die Funktion auf diesen Zustand an;
- Wir führen Messungen auf den Outputs der Funktion an, so dass der Zustand zu einer Superposition von Zuständen kollabiert, mit denen die Periode der Funktion gefunden werden kann;
- Wir wenden die Quanten-Fourier-Transformation auf diesen Zustand an und führen wieder eine Messung durch, um die Periode zu erhalten.
Im 4. Schritt erhalten wir zwar nur ein (sehr) wahrscheinliches Ergebnis für die Periode und nicht zwingend den exakten Wert. Diese Information reicht aber bereits aus, da die Periode auf einem klassischen Computer schnell überprüft werden kann.
Praktisches Beispiel
Im folgenden Beispiel bilden wir eine modulare Potenz für den Schlüssel pq=15 mit Basis 7. In der linken Tabelle sind die Potenzen von 7 aufgeführt. In der rechten Tabelle sind diese Zahlen im Binärcode dargestellt, hier ist also die Funktion dargestellt, wie sie durch Gatter implementiert wird:

Wir verwenden die vier Qubits , , , , um die Input-Binärzahl darzustellen, und die vier Qubits , , , , für die Output-Binärzahl .
Wir konstruieren einen Schaltkreis durch Kombination von NOT-, CNOT- und Toffoli(CCNOT)-Gattern, um die Funktion aus der Tabelle zu implementieren.
Man sieht in der Tabelle, dass der Wert des Outputs nur von den beiden letzten Input-Qubits abhängt. Daher brauchen die beiden Qubits und nicht verbunden werden und können in diesem Fall ignoriert werden.
Wir konstruieren den Schaltkreis, indem wir betrachten, wie und jedes Output-Qubit beeinflussen.
Wir beginnen bei (das letzte Output-Qubit) und extrahieren die relevanten Informationen aus der Tabelle für die Abhängigkeit von und :
| x1x0 | x7 |
|---|---|
| 01 | 0 |
| 10 | 0 |
| 11 | 1 |
| 00 | 0 |
Das Qubit ist also nur dann , wenn sowohl als auch im Zustand sind, und in allen anderen Fällen (im Klassischen ist dies eine UND-Operation). Implementiert wird dies durch ein Toffoli-Gatter, ein doppeltes CNOT, welches das Ziel-Qubit ändert, wenn beide Kontroll-Qubits in sind. Im Quanten Composer wird dies so dargestellt:

Für :
| x1x0 | x6 |
|---|---|
| 01 | 1 |
| 10 | 1 |
| 11 | 1 |
| 00 | 0 |
Der Output ist , wenn mindestens eines der Inputs oder im Zustand ist (eine klassische ODER Operation). Wir können je ein CNOT verwenden, für den Fall, dass jeweils nur eines der Input-Qubits in Zustand ist. Wenn jedoch beide Inputs in Zustand sind, werden die beiden CNOTs den Zustand von wieder zu ändern. Dieser Fall wird durch ein Toffoli-Gatter aufgefangen:

Für :
| x1x0 | x5 |
|---|---|
| 01 | 1 |
| 10 | 0 |
| 11 | 0 |
| 00 | 0 |
Der Output ist nur dann , wenn = und = . Dies erreichen wir durch ein CNOT-Gatter, welches und verbindet und einem anschließenden Toffoli-Gatter, welches den Fall korrigiert, wenn beide Inputs in Zustand sind:

Für :
| x1x0 | x4 |
|---|---|
| 01 | 1 |
| 10 | 0 |
| 11 | 1 |
| 00 | 1 |
Der Output ist also , wenn nur in Zustand ist. Dazu wenden wir ein CNOT-Gatter zwischen und , sowie ein Toffoli-Gatter von und zu , gefolgt von einem NOT-Gatter auf :

Dieser Schaltkreis implementiert insgesamt die Funktion für alle Inputs von x. Dies entspricht dem Schritt (1) des Shor-Algorithmus.
Das Arbeitsblatt enthält ein Beispiel zum Aufbau der modularen Exponentialfunktion auf einem Quantencomputer. Der Aufbau ist recht komplex. Deshalb empfiehlt es sich, die Schritte mithilfe eines Quantum Composers zu demonstrieren.
In der Tabelle sind die Qubits dabei von rechts nach links notiert, d. h. q[0] stellt den Wert dar, q[1] den Wert , q[2] entsprechend 4 und q[3] den Wert 8. Die Output-Qubits sind analog angeordnet.
Aufgabe 2: Baue einen Schaltkreis für eine andere modulare Potenz
Entwickle den Schaltkreis für die Potenz . Beginne bei den beiden Tabellen und erzeuge, wie im Beispiel zu , schrittweise den Schaltkreis. Beachte, dass der Output wieder nur von und abhängt.

Die Schülerinnen und Schüler sollen das Beispiel verwenden, um die Tabelle auszufüllen und den Schaltkreis für zu konstruieren. Die resultierende Schaltung ist lediglich eine Umordnung der bereits gezeigten Schaltung für .
Lösung:
Schaltkreis:

Knacken des Codes
Mit dieser Funktion der modularen Potenz können wir den Algorithmus implementieren:
- Wir wenden Hadamard-Gatter auf alle Input-Qubits an und anschließend den Schaltkreis der modularen Potenz. Damit erhalten wir eine Superposition aller möglichen Output-Zustände der modularen Funktion.
- Führe eine Messung auf allen Output-Qubits durch. Dadurch wird die Superposition der Input-Qubits auf die Zustände reduziert, die die Periode erzeugen.
- Wende die Quanten-Fourier-Transformation durch, um einen Zustand zu erzeugen, dessen Wahrscheinlichkeitsdichtefunktion durch die Periode der modularen Potenz bestimmt ist.
- Führe eine Messung auf den Input-Qubits durch. Führe den Algorithmus mehrmals aus und verwende die Ergebnisse mit der höchsten Häufigkeit, um die Periode der Wahrscheinlichkeitsdichtefunktion zu erhalten.
Der komplette Algorithmus, in Gattern implementiert, ist in den folgenden Abbildungen für den Fall gezeigt. Für die Übersichtlichkeit ist dies in zwei Abbildungen dargestellt. In der ersten Abbildung sind die ersten beiden Schritte (Hadamard, modulare Potenz und Messung der Output-Qubits) dargestellt:

Anschließend folgt die Quanten-Fourier-Transformation und die Messung auf den input-Qubits. Die Quanten-Fourier-Transformation selbst ist eine Kombination aus Hadamard-Gattern und kontrollierten Rotationsgattern (dies wird hier nicht weiter ausgeführt):

Die Wahrscheinlichkeitsdichtefunktion des Endzustands der Input-Qubits hat Peaks bei Vielfachen , wobei die Anzahl der Qubits ist und die Periode der modularen Potenz. Wenn man die Lage der Peaks betrachtet, kann man demnach die Periode abschätzen.
Der Graph zeigt ein Ergebnis, wenn man den Algorithmus (s. oben) für 1024 mal laufen lässt:

Man kann gut erkenne, dass Peaks bei Vielfachen von 4 auftreten. Da in diesem Fall und damit ist, ist die Periode . In diesem einfachen Beispiel konnte man dies bereits in der Tabelle erkennen. Bei größeren Schlüsseln wären wir allerdings nicht mehr in der Lage, die Periode vorher zu erkennen. In diesen Fällen liefert der Shor-Algorithmus eine Lösung des Problems in umsetzbarer Laufzeit.
Hinweise:
Die Theorie der Quanten-Fourier-Transformation (QFT) und deren Konstruktion mit Quantengattern wird im Arbeitsblatt nicht behandelt, da dies deutlich über das Niveau der Schulmathematik hinausgeht. N. David Mermins “Quantum Computer Science” ist geeignet, falls Schüler*innen sich weiter einarbeiten möchten.
Es ist nicht vorgesehen, dass die Lernenden die vollständige Schaltung von Shors Algorithmus selbst implementieren. Dies kann jedoch als Erweiterungsaufgabe erfolgen. Dafür wäre allerdings ein vollständiger Zugriff auf einen Quantencomputer notwendig.
Aufgabe 3: Überprüfe, dass das RSA-Verfahren geknackt wurde
Wir verwenden als Beispiel pq = 15, Klartext = 7 und Verschlüsselungsschlüssel e = 3:
- Berechne den Geheimtext.
- Nutze die Periode, die wir mit dem Shor-Algorithmus gefunden haben (r = 4), um d’ zu berechnen. (Beachte, dass d’ so gewählt wird, dass )
- Überprüfe, dass der Geheimtext wieder den Klartext ergibt, wenn er mit d‘ potenziert (mod 15) wird.
Herzlichen Glückwunsch! Du hast die RSA-Verschlüsselung geknackt!
Lösungen:
- Geheimtext = 13;
- d’ = 3;
- wie gefordert.
Schlusswort
Shors Algorithmus wurde bisher nicht auf einem Quantencomputer implementiert, so dass reale RSA-Systeme bedroht sind. Unser Beispiel war stark vereinfacht, da die zugrunde liegende Funktion eine kurze Periode hatte. In echten Anwendungen gibt es keine einfache Abbildung von Input- auf Output-Qubits, und bisher wurde kein allgemeiner Weg für die Konstruktion des Schaltkreises für beliebige modulare Potenzen entwickelt.
Doch allein die Aussicht, dass Shors Algorithmus eines Tages praktikabel wird, hat zur Entwicklung eines neuen Forschungsfeldes geführt: Post-Quantum-Kryptographie – entworfen, um unsere Daten auch in einer Quantenwelt sicher zu halten.
Diese Seite teilen