Um nun ein RSA-Schlüsselpaar zu erzeugen, wählt man zufällig zwei große, ungefähr gleich lange Primzahlen p und q und multipliziert sie miteinander:
Das Ergebnis n, auch Modul (modulus) genannt, soll nach aktuellen Empfehlungen mindestens 768 Bit lang sein. Die für PGP 2.x typischen 1024 Bit stellen sicher momentan (noch) eine gute Wahl dar. Demnach müßten unseren beiden Faktoren p und q eine Länge von ca. 512 Bit haben.n = pq
Generell sollten diese zwei Primzahlen nicht extrem nahe beieinander liegen. Unter "extrem nah" versteht man in den RSA-FAQ, daß sie mit Ausnahme von z.B. 100 bis 200 Bits identisch sind. An gleicher Stelle wird aber auch darauf hingewiesen, daß die Wahrscheinlichkeit dafür, bei zufälliger Wahl zwei so extrem nahe Primzahlen zu finden, vernachlässigbar ist.
Um den öffentlichen Schlüssel zu generieren, wählt man eine zufällige ganze
Zahl e mit
gilt. Das bedeutet, der größte gemeinsame Teiler (ggT) von e und phi(n) ist 1. Man nennt diese beiden Zahlen daher teilerfremd. Wir können auch sagen, sie haben nur die 1 als gemeinsamen Faktor.ggT(e, phi(n)) = 1
Die Funktion phi(n) gibt an, wieviele Zahlen kleiner n
teilerfremd zu n sind. Sie wird mitunter als Eulersche
phi-Funktion (benannt nach dem bedeutenden schweizer Mathematiker
Leonhard Euler) bzw. im Englischen auch als Euler's totient function
bezeichnet. Wir verzichten hier auf den sonst als Symbol üblichen griechischen
Buchstaben , da er sich in HTML nicht bequem
handhaben läßt.
Im allgemeinen ist es schwer, phi(n) für sehr große n zu bestimmen. Bei uns liegt aber ein Sonderfall vor. Wir haben n gezielt als Produkt zweier Primzahlen p und q konstruiert. Damit läßt sich der Funktionswert sehr leicht berechnen:
phi(n) = (p-1)(q-1).
Das Zahlenpaar (e, n) stellt den öffentlichen Schlüssel dar.
Für die Erzeugung des privaten Schlüssels ist die Zahl d zu ermitteln, die bezüglich der Multiplikation modulo phi(n) das inverse Element (im Englischen multiplicative inverse und im Deutschen manchmal auch modulare Inverse genannt) zu e darstellt, so daß
gilt, wobei k eine ganze Zahl ist und das Zeichen × die Multiplikation symbolisiert.ed mod phi(n) = 1 bzw.
ed = k × phi(n) + 1
Das gesuchte inverse Element ist immer eindeutig bestimmt. Es gilt stets
Das inverse Element läßt sich relativ einfach mit Hilfe einer Erweiterung des Euklidischen Algorithmus berechnen, dessen eigtl. Anliegen die Ermittlung des größten gemeinsamen Teilers zweier Zahlen ist. Für Details sei auf mathematische oder kryptologische Lehrbücher verwiesen.
Man nennt d und e zueinander reziprok modulo phi(n) und schreibt auch
d = e-1 mod phi(n).
Die Zahl d dient als privater Schlüssel.
Anmerkung: Manche Autoren bezeichnen auch das Zahlenpaar
(d, n) als Private Key.
Sobald die beiden Keys generiert wurden, benötigt man die Primzahlen p und q nicht mehr. Manche Autoren empfehlen, sie deshalb zu vernichten. Anderenfalls muß man sie genauso sicher wie den privaten Schlüssel aufbewahren und darf sie niemals offenlegen, da sonst jeder auf die oben genannte Weise den Private Key ermitteln kann.
Klar- und Geheimtexte werden blockweise ver- bzw. entschlüsselt. Der numerische Wert eines jeden Blocks muß stets kleiner als n sein. Bei Binärdaten ergibt sich daher dessen maximale Bitanzahl als Exponent der größten Zweierpotenz, die kleiner als oder gleich n ist. Wenn n z.B. den Wert 3220 hat, so darf jeder Block höchstens 11 Bits umfassen, da 211 = 2048 noch unterhalb und 212 = 4096 bereits oberhalb von 3220 liegt.
Die Verschlüsselung des Klartextblocks mi erfolgt durch dessen Exponentiation unter Verwendung des öffentlichen Schlüssels nach der folgenden einfachen Formel, wodurch der Geheimtextblock ci entsteht:
Die Umkehroperation, also die Dechiffrierung von ci, hat dieselbe Struktur, wobei natürlich diesmal der private Schlüssel zum Einsatz kommt:ci = mi e mod n.
Es läßt sich relativ leicht zeigen, daß jede der beiden Formeln die durch die jeweils andere vorgenommene Transformation rückgängig macht. Wir beginnen mit einem Satz von Euler, der besagt, daß für zwei teilerfremde natürliche Zahlen m und n immermi = ci d mod n.
gilt. Unter Beachtung dieses Satzes sowie der oben gezeigten Gleichungm phi(n) mod n = 1
läßt sich die Dechiffrierung des zu einem Klartextblock M gehörenden Geheimtextes C so beschreiben (alle Operationen verstehen sich wieder modulo n):ed = k × phi(n) + 1
Wir erkennen, daß der Klartext bei der Entschlüsselung wieder korrekt entsteht. Das ist auch der Fall, wenn wir mit dem privaten Schlüssel chiffrieren und mit dem öffentlichen Schlüssel dechiffrieren (alles modulo n):C d = (M e) d = M ed = M k × phi(n)+1 = [M phi(n)]k M = 1k M = M.
Das dabei im ersten Schritt entstehende Chiffrat stellt eine digitale Signatur dar:(M d)e = M de = M ed = M.
Sie kann nur vom Inhaber des privaten Schlüssels erzeugt werden. Die Gegenoperation, d.h. die Verifikation der Signatur, ist dagegen jedermann möglich, da dafür nur der öffentliche Schlüssel benötigt wird. Die Unterschrift ist genau dann korrekt, wennS = M d mod n.
gilt.M = S e mod n
Wir hatten an anderer Stelle schon darauf hingewiesen, daß man in der Regel nicht die Nachricht selbst, sondern deren Hashwert unterschreibt. In diesem Falle dürfte ein einzelner Datenblock ausreichen, da die Ergebnisse der üblichen Hashfunktionen deutlich kleiner als jeder praxistaugliche Modul n sind. Deshalb wurde bei S im Gegensatz zu ci bewußt auf eine Indexierung verzichtet.
Ein signierter Hashwert, wie er für Signaturverfahren mit Anhang üblich ist,
gestattet eine sehr schnelle und sichere Verifikation der digitalen
Unterschrift. Man muß dazu lediglich selbst den Hashwert der Nachricht
ermitteln und diesen mit dem Ergebnis von
Sofern bei Signaturverfahren mit Nachrichtenrückgewinnung die Nachricht nicht explizit in der Signatur enthalten ist, dann berechnet der Verifizierer über den Ausdruck
die vermeintliche Originalnachricht und überprüft anschließend mit geeigneten Mitteln deren Integrität und Authentizität. Speziell bei natürlichsprachigen Nachrichten testet man dazu gewöhnlich, ob die zurückgewonnene Information einem zuvor festgelegten Redundanzschema genügt.S e mod n
Der besseren Übersicht wegen fassen wir nachfolgend die wichtigsten Punkte des RSA-Algorithmus kurz zusammen:
p = 47, q = 71, n = 3337, phi(n) = 46×70 = 3220, e = 79 und d = 1019.Unser Klartext laute DR DOBBS (der Name einer bekannten Computer-Zeitschrift). Es gibt verschiedene Möglichkeiten, ihn in eine Zahl zu konvertieren. Wir wollen einfach die numerischen Werte der einzelnen ASCII-Zeichen aneinanderreihen, also 68 für D, 82 für R und so weiter. Dann ergibt sich als zu chiffrierende Nachricht die Zahl
m = 6882326879666683.Der Wert jedes Blocks muß kleiner als 3337 sein. Wenn man die Nachricht als Zahl und nicht als Bitfolge betrachtet, bietet es sich im konkreten Fall an, immer 3 aufeinanderfolgende Ziffern zu einem Block zusammenzufassen. Wir erhalten so insgesamt 6 Blöcke:
m1 = 688Der erste Geheimtextblock ergibt sich zu
m2 = 232
m3 = 687
m4 = 966
m5 = 668
m6 = 3
Analog entstehen die anderen Blöcke des Chiffrats:c1 = 68879 mod 3337 = 1570
Die Entschlüsselung erfordert ebenfalls eine Exponentiation, diesmal allerdings mit d statt e:c = 1570 2756 2091 2276 2423 158
m1 = 15701019 mod 3337 = 688
...
m6 = 1581019 mod 3337 = 3
Derartige Werte sind zwar auf einem PC unter Verwendung einer geeigneten Langzahl-Arithmetik, also einer Arithmetik mit "beliebiger" Genauigkeit, noch recht gut beherrschbar, allerdings nehmen der Rechenaufwand sowie der Speicherplatzbedarf mit wachsenden Exponenten und Moduln rapide zu. Um beim RSA eine hohe Sicherheit zu erreichen, nutzt man heute Dezimalzahlen mit 200 und mehr Stellen. Mit derartigen Werten wäre eine Potenzierung entweder überhaupt nicht mehr realisierbar oder würde extrem lange dauern.
Diesem Problem kann man durch zwei relativ einfache Maßnahmen effektiv begegnen, wenngleich eine Langzahl-Arithmetik dadurch keinesfalls entbehrlich wird:
Wir können also Zwischenprodukte jeweils modulo n reduzieren und so die Werte relativ klein und damit praktikabel halten.[(a mod n) × (b mod n)] mod n = (a × b) mod n
iterativ bilden. Dieses Vorgehen erfordert 78 Multiplikationen und ist daher relativ langsam. Wenn wir dagegen durch wiederholte Quadrierung zunächst die Potenzen688m+1 = 688m × 688 (0 < m < 79)
und dann das Produktp1 = 6882
p2 = p12 = 6884
p3 = p22 = 6888
p4 = p32 = 68816
p5 = p42 = 68832
p6 = p52 = 68864
bilden, erhalten wir das gewünschte Resultat bereits nach 10 Multiplikationen.p6 × p3 × p2 × p1 × 688 = 68879
Daraus kann man folgenden, auch bei großen Zahlen relativ effizienten
Algorithmus für die Berechnung von
d = 1 for k = i downto 0 do d = (d × d) mod n if (bk=1) then d = (d × a) mod n return d
Zum Test, ob es sich bei einer gegebenen Zahl um eine Pseudoprimzahl handelt, wird der Kleine Fermatsche Satz (benannt nach dem bedeutenden französischen Mathematiker Pierre de Fermat) genutzt:
Wenn p eine Primzahl ist und a eine ganze Zahl, die sich nicht ohne Rest durch p teilen läßt, so ista p-1 - 1 durch p teilbar.
Man kann ihn auch so schreiben:
Anmerkung: Dieselbe Aussage erhalten wir durch den Satz von Euler, der eine Generalisierung des Kleinen Fermatschen Satzes darstellt. phi(p) hat im konkreten Fall den Wert p-1.a p-1 mod p = 1.
Nun stellt sich die Frage, ob obige Gleichung auch gilt, wenn p eine
zusammengesetzte Zahl, d.h. keine Primzahl ist. Die Antwort lautet:
normalerweise nicht. Man könnte daher den Test, ob es sich bei einer Zahl
n um eine Primzahl handelt, so vornehmen, daß man eine beliebige Zahl
a mit
Bei einer zufällig erzeugten, ca. 100-stelligen Dezimalzahl beträgt die in der Literatur angegebene Irrtumswahrscheinlichkeit bei diesem Verfahren ungefähr 10-13. Verwendet man beim RSA für p oder q eine zusammengesetzte Zahl statt einer Primzahl, so kann es passieren, daß sich ein Chiffrat nicht entschlüsseln läßt oder daß es jemandem gelingt, den privaten Schlüssel mit weniger Aufwand als angenommen zu bestimmen.
Durch eine mehrfache Anwendung des Tests mit jeweils verschiedenen Werten für
a läßt sich dessen Zuverlässigkeit in der Regel immer weiter erhöhen,
natürlich auf Kosten der Rechenzeit. Es gibt allerdings einige n, die
sog. Carmichael-Zahlen, die, obwohl sie keine Primzahlen sind, für alle
Werte von a die Gleichung
Carmichael-Zahlen kommen sehr selten vor, so daß die Wahrscheinlichkeit dafür, daß man zufällig eine wählt, äußerst gering ist. In der Praxis verwendet man dennoch meist Erweiterungen des obigen Primzahlentests, die mit sehr hoher Wahrscheinlichkeit zusammengesetzte Zahlen inkl. Carmichael-Zahlen erkennen, da der hierfür benötigte zusätzliche Rechenaufwand verhältnismäßig gering ist.
Ein sehr häufig eingesetztes Verfahren ist der probabilistische Primzahlentest
nach Michael Rabin, der teilweise auf Ideen von Gary Miller basiert und deshalb
auch als Miller-Rabin-Test bezeichnet wird. Ausgangspunkt ist die
Tatsache, daß man n-1 immer als Produkt einer Zweierpotenz und einer
ungeraden Zahl ausdrücken kann:
Wenn dabei keine Eins entsteht, dann ist n definitiv keine Primzahl. Ergibt sich die Zahl 1, dann schaut man sich die als Zwischenergebnisse gebildeten Quadrate an (in einer effizienten Implementierung tut man dies sinnvollerweise parallel zur Berechnung). Stellt sich dabei heraus, daß irgendwo eine Eins entstanden ist, obwohl der Ausgangswert weder 1 noch n-1 war, dann handelt es sich ebenfalls definitiv um keine Primzahl, denn wenn n prim wäre, kämen nur die Werte 1 und n-1 (letzterer ist kongruent zu -1 modulo n) als Quadratwurzeln modulo n von 1 in Frage.
Jede Zahl a, die nicht anzeigt, daß n definitiv zusammengesetzt
ist, wird als Zeuge (witness) für die Primzahleigenschaft von n
bezeichnet. Rabin hat bewiesen, daß bei zusammengesetzten Zahlen n die
Anzahl derartiger Zeugen kleiner als (n-1)/4 ist. Wenn n ungerade
ist und sich k zufällig gewählte Werte a mit
Anmerkung: Viele Autoren nutzen den Begriff Zeugen genau umgekehrt, also
für Zahlen, die mit Sicherheit anzeigen, daß n zusammengesetzt ist. In
diesem Falle gilt analog zur obigen Aussage: Wenn n eine ungerade
zusammengesetzte Zahl ist, dann sind mehr als drei Viertel der ganzen Zahlen
a mit
Schneier gibt folgende Notation des Algorithmus an:
Der zweite Weg ist deshalb sehr interessant, weil (nach momentanem Erkenntnisstand) die Sicherheit von RSA im allgemeinen nicht negativ beeinflußt wird, wenn man immer denselben Wert für e verwendet, wobei dieser auch sehr klein sein kann. Kleine Exponenten beschleunigen deutlich die mit dem öffentlichen Schlüssel ausgeführten Operationen, also Chiffrierung sowie die Verifikation von Unterschriften, ohne diejenigen negativ zu beeinflussen, die den privaten Schlüssel verwenden.
Die am häufigsten genutzten Exponenten sind 3, 17 und 65537. Bei letzterem
handelt es sich um die vierte Fermat-Zahl F4 (ebenfalls nach Pierre
de Fermat benannt). Sie läßt sich in der Form
Die einzelnen Standards enthalten unterschiedliche Empfehlungen für e:
X.509 65537 PEM 3 PKCS #1 3 oder 65537
Es wird allgemein angenommen, daß die als Verschlüsselungsfunktion verwendete Potenzierung modulo n unter bestimmten Voraussetzungen eine Einwegfunktion mit Falltür darstellt:
Der Modul n ist bekanntlich das Produkt der zwei großen Primzahlen p und q. Diese beiden Zahlen stellen die Falltür dar. Wenn man sie kennt, kann man sofort phi(n) und damit relativ einfach ein d (den privaten Schlüssel) finden, so daßf(M) = Me mod n.
gilt. Sind die Primfaktoren dagegen nicht bekannt, könnte man nun versuchen,(Me)d mod n = M
All dies erscheint nicht erfolgversprechend:
Auch wenn der Basis-Algorithmus sicher erscheint, so reicht dies in der Praxis nicht aus. Generell gilt, daß das ganze Kryptosystem sowie das verwendete Protokoll ebenfalls sicher sein müssen. So haben verschiedene Attacken Erfolg, die sich gegen die konkrete Implementation von RSA richten. Details sind hierbei sehr entscheidend.
Wenn z.B. der Exponent e wie üblich relativ klein gewählt wird, so sollte man die zu chiffrierende Nachricht immer durch ein Padding mit in der Regel zufälligen Werten auffüllen. Nehmen wir an, daß e den Wert 3 hat. Falls dann die Nachricht sehr klein ist, konkret kleiner als die dritte Wurzel des Moduls n, dann ergibt sich als Chiffrat der Ausdruck m3. Daraus kann der Klartext durch Bestimmung der dritten Wurzel sehr einfach ermittelt werden.
Durch Padding erreicht man, daß m3 den Wert des Moduls
übersteigt und so beim Chiffrieren eine Reduktion modulo n stattfindet.
Als Geheimtext erhalten wir dann wirklich wie erwartet m3 mod
n statt m3. Außerdem verhindert das Auffüllen mit
verschiedenen Werten noch eine weitere Attacke: Wenn man nämlich bei
Ein weiterer Ansatzpunkt ist eine chosen-ciphertext attack, also ein Angriff, bei dem sich der Kryptoanalytiker verschiedene, von ihm gezielt konstruierte Chiffrate entschlüsseln lassen kann, und zwar, indem er sie dem Opfer, nennen wir es Anton, zum Signieren vorlegt. Mit den dabei entstehenden Ergebnissen (d.h. den Signaturen) kann er je nach Situation Nachrichten dechiffrieren, die mit Antons öffentlichem Schlüssel chiffriert worden sind, oder sich Antons Unterschrift für ein Dokument berechnen, daß dieser nie zuvor gesehen hat.
Letzteres wird durch folgendes Beispiel illustriert: Berta benötigt Antons Unterschrift für eine Nachricht m3. Da er den Inhalt nicht kennen soll, generiert sie zwei Nachrichten m1 und m2, so daß
gilt. Wenn es ihr gelingt, diese beiden von Anton signieren zu lassen, kann sie die gesuchte Unterschrift sehr leicht selbst berechnen:m3 = m1 m2 mod n
Als wichtige Erkenntnis sollte man daraus mitnehmen, daß RSA nie dazu genutzt werden darf, irgendein beliebiges Dokument, daß ein Fremder vorlegt, zu unterschreiben. Signiert werden darf maximal der über eine Einweg-Hashfunktion berechnete Hashwert, da dann die auf Gesetzmäßigkeiten der Modulo-Arithmetik beruhenden Attacken nicht mehr funktionieren.m3d = (m1d mod n) (m2d mod n) mod n
Für weitere Details zu Angriffen auf RSA-Implementierungen sei auf entsprechende Literatur verwiesen (z.B. Schneier, Kaufman und Menezes).
Die von der Firma RSA Data Security, Inc. (RSADSI) in Zusammenarbeit mit einem inoffiziellen Konsortium (zu dem usrprünglich Apple, Microsoft, DEC, Lotus, Sun und das MIT gehörten) entwickelten Public-Key Cryptography Standards (PKCS) stellen einen Satz von Standards für Public-Key-Kryptographie dar, die neben syntaktischen Festlegungen auch algorithmenspezifische sowie algorithmenunabhängige Vorschriften für die Schlüsselerzeugung, die Ver- und Entschlüsselung von Nachrichten sowie die Berechnung und Verifikation von digitalen Signaturen enthalten.
PKCS ist kompatibel zu PEM (Privacy Enhanced Mail), erweitert diese aber z.B. um die Möglichkeit, allgemeine Binär- und nicht nur reine ASCII-Daten verarbeiten zu können. PKCS ist auch kompatibel zum Standard X.509 der ITU-T.
Die einzelnen Dokumente werden numeriert (z.B. PKCS #1, #3, #5). Einen Überblick über die aktuell gültigen Standards und neue Entwicklungen finden Sie z.B. in den RSA-FAQ oder unter http://www.rsa.com/rsalabs/pubs/PKCS/. Über diesen URL können Sie die PKCS-Dokumente in verschiedenen Formaten kostenfrei beziehen.