In der Kryptografie ist die modulare Exponentiation ai mod n eine häufige Rechenoperation. Realisiert wird die modulare Exponentiation durch das schnelle Square-and-Multiply-Verfahren, bei dem aber dennoch viele modulare Multiplikationen der Form a·b mod n erforderlich sind. Dabei sind die beteiligten Zahlen sehr groß, z.B. 1024 Bit lang. Die Reduktion modulo n verlangt normalerweise eine Division; diese ist bei großen Zahlen sehr aufwendig.
Die Montgomery-Multiplikation [Mont 85] ist ein Verfahren zur modularen Multiplikation, bei dem nur in einer Vorbereitungsphase eine Reduktion modulo n erforderlich ist. Anschließend sind nur Multiplikationen und Additionen erforderlich sowie außerdem div- und mod-Operationen mit einer Zweierpotenz m. Bei binärer Zahlendarstellung sind aber diese beiden letzteren Operationen sehr einfach zu realisieren.
Bei der Montgomery-Multiplikation wird nicht im Ring ℤn gerechnet, sondern in einem isomorphen Ring. Hierdurch ist es möglich, die Reduktion modulo n durch die erwähnten leichteren Operationen mit der Zweierpotenz m zu ersetzen.
Die Menge ℤn = {0, ..., n-1} bildet mit den Verknüpfungen Addition modulo n und Multiplikation modulo n sowie den neutralen Elementen 0 bzw. 1 einen Ring mit Eins:
R = (ℤn, +n, ·n, 0, 1)
Die Verknüpfungen +n und ·n bedeuten Addition modulo n und Multiplikation modulo n.
Bei der Montgomery-Multiplikation wird ein zu R isomorpher Ring S verwendet. Die Abbildung h von R nach S ist wie folgt definiert:
h(a) = a·m mod n
für alle a ∈ R. Hierbei ist m eine Zweierpotenz größer als n.
Damit ergibt sich der Ring S als
S = (ℤn, +n, ⊙, 0, e)
Die Verknüpfungen in S sind Addition modulo n sowie folgende speziell definierte Multiplikation ⊙. Für alle Elemente x, y ∈ S ist
x ⊙ y = x · y · m-1 mod n
Offenbar ist diese Multiplikation assoziativ und kommutativ. Das bezüglich dieser Multiplikation neutrale Element e ist m mod n.
Damit die Abbildung h bijektiv ist, muss die Zahl m teilerfremd zu n sein – da aber in der Praxis n stets ungerade ist, ist dies bei einer Zweierpotenz m gegeben. Die Abbildung ist außerdem verknüpfungstreu, denn es gilt für die Addition
h(a + b) | Definition von h ≡ | (a + b) · m | Ausmultiplizieren ≡ | a·m + b·m | Definition von h ≡ | h(a) + h(b) (mod n) |
sowie für die Multiplikation
h(a · b) | Definition von h ≡ | (a · b) · m | Multiplikation mit 1 ≡ | a · b · m · m · m-1 | Kommutativität der Multiplikation ≡ | a · m · b · m · m-1 |
Definition von h ≡ | h(a) · h(b) · m-1 | Definition von ⊙ ≡ | h(a) ⊙ h(b) (mod n) |
Damit ist die Abbildung h ein Isomorphismus von R nach S. Für die Berechnung der Abbildung h und der inversen Abbildung h-1 sowie der Montgomery-Multiplikation ⊙ spielt die im Folgenden definierte Montgomery-Reduktion eine entscheidende Rolle.
Die Montgomery-Reduktion ist definiert als die Funktion
mred(x) = x·m-1 mod n
für alle x ∈ {0, ..., n-1}.
Die Funktion mred ist identisch mit der inversen Abbildung h-1.
Die Montgomery-Reduktion ist auch Teil der Montgomery-Multiplikation im Ring S:
x ⊙ y = x · y · m-1 mod n = mred(x·y)
und sie lässt sich verwenden, um die Abbildung h zu berechnen. Die Berechnung von h(a) wird in folgender Weise durchgeführt:
h(a) = a·m mod n = a·m·m·m-1 mod n = a ⊙ (m2 mod n)
Die Modulo-n-Reduktion von m2 ist erforderlich, weil die Verknüpfung ⊙ nur für Werte aus ℤn definiert ist.
Ziel ist es, die Montgomery-Reduktion ohne die aufwendige mod-n-Operation zu bewerkstelligen und stattdessen nur div- und mod-Operationen mit der Zweierpotenz m durchzuführen. Die Grundlage hierfür liefert der folgende Satz.
Satz: (Montgomery, 1985)
Sei m > n und m teilerfremd zu n, sei ferner 0 ≤ x < n·m, und sei schließlich n' = - n-1 mod m und t = x·n' mod m. Dann gilt
x + t·n ≡ 0 (mod m),
d.h. x + t·n lässt sich ganzzahlig durch m dividieren. Ferner gilt
(x + t·n) div m ≡ x·m-1 (mod n),
d.h. der Quotient q = (x + t·n) div m ist bereits fast der gesuchte Wert mred(x) = x·m-1 mod n. Allerdings gilt nicht die Gleichheit, sondern nur die Kongruenz modulo n. Mit folgender dritten Aussage aber lässt sich folgern, dass entweder q oder q – n der gesuchte Wert ist:
0 ≤ (x + t·n) div m < 2n.
Beweis:
Die erste Aussage des Satzes ergibt sich wie folgt:
x + t·n | Definition von t ≡ | x + x·n'·n | Definition von n' ≡ | x + x·(- n-1)·n | inverse Elemente ergeben 1 ≡ | x + x·(-1) | ≡ | x – x | ≡ | 0 (mod m) |
Als nächstes zeigen wir die zweite Aussage:
(x + t·n) div m | Definition von div ≡ | (x + t·n) · m-1 | Ausmultiplizieren ≡ | x·m-1 + t·n·m-1 | Vielfaches von n ist kongruent 0 mod n ≡ | x·m-1 | (mod n) |
Nach Voraussetzung des Satzes gilt 0 ≤ x < n·m, ferner 0 ≤ t < m und damit
0 ≤ x + t·n < n·m + n·m = 2·n·m
Nach Division durch m ergibt sich hieraus die dritte Aussage.
Unter Benutzung des Satzes von Montgomery ist es also möglich, die in der Funktion mred enthaltene mod-n-Berechnung zu vermeiden. Stattdessen ist lediglich eine Operation modulo m und eine Division durch m erforderlich. Da m eine Zweierpotenz ist, lassen sich diese Berechnungen bei binärer Zahlendarstellung sehr einfach realisieren.
Für die Realisierung der Montgomery-Reduktion, nämlich der Multiplikation modulo n mit m-1, wird folgende Berechnung durchgeführt. Der Modul n mit n ungerade und die Zweierpotenz m > n sind vorgegeben.
Algorithmus Montgomery-Reduktion mred(x)
Eingabe:
Zahl x mit 0 ≤ x < n·m, vorausberechnete Zahl n' = - n-1 mod m
Ausgabe:
mred(x) = x·m-1 mod n
Methode:
Bei dieser Berechnung werden nur Addition und Multiplikation sowie die div- und mod-Operation mit der Zweierpotenz m verwendet.
Anstelle der Berechnung c = a · b mod n wird h(c) = h(a) ⊙ h(b) berechnet. Hierzu müssen a und b in h(a) und h(b) transformiert werden, dann mit der Montgomery-Multiplikation ⊙ multipliziert werden, und schließlich muss das Ergebnis h(c) mit der inversen Abbildung h-1 zurücktransformiert werden, um c zu erhalten. Wir hatten gesehen, dass sich alle diese Berechnungen mithilfe der Montgomery-Reduktion mred durchführen lassen.
Zwar lohnt sich dieser Aufwand für eine einzelne modulare Multiplikation kaum, wohl aber für fortgesetzte modulare Multiplikationen wie etwa bei der modularen Exponentiation. Bild 1 zeigt das Schema der Berechnungen; dieses Schema ist typisch für die Anwendung einer Transformation.
Bild 1: Berechnungsschema der modularen Exponentiation mithilfe von Montgomery-Multiplikationen
Statt ai mod n direkt zu berechnen (oberer Pfeil), wird a zunächst in h(a) transformiert, dann wird mithilfe von Montgomery-Multiplikationen h(a)i berechnet, also h(a) ⊙ ... ⊙ h(a) (i-mal). Weil die Abbildung h verknüpfungstreu ist, ist dies dasselbe wie h(ai mod n). Mit der inversen Transformation h-1 ergibt sich schließlich ai mod n.
Es folgt die Implementierung in der Programmiersprache Python; eine entsprechende Implementierung in Java ist ebenfalls vorhanden.
Gegeben ist der Modul n mit n ungerade. In der Funktion preprocess werden k und m = 2k ermittelt; ferner werden die Werte np = n' = -n-1 mod m und mm = m2 mod n vorausberechnet. Die Hilfsfunktion inv2(n, k) zur Berechnung des multiplikativ inversen Elements von n modulo 2k ist weiter unten angegeben.
In der Funktion mred wird die Operation mod m durch bitweises Und mit den k Einsen von m-1 realisiert, die Operation div m durch Rechtsschieben um k Stellen.
Die Berechnung von 2k wird durch Linksschieben von 1 um k Stellen realisiert, also durch Anhängen von k Nullen.
Auch gelegentlich vorkommende Berechnungen wie i%2 oder i//2 lassen sich durch Bit-Operationen realisieren (hier nicht durchgeführt).
Mithilfe dieser Funktionen lässt sich die schnelle modulare Exponentiation ai mod n wie folgt realisieren:
In der Funktion preprocess wird das multiplikativ inverse Element von n modulo m benötigt. Standardmäßig wird das multiplikativ inverse Element mithilfe des erweiterten euklidischen Algorithmus berechnet. Im vorliegenden speziellen Fall ist allerdings der Modul m eine Zweierpotenz.
Eine brutal schnelle Alternative für die Berechnung des multiplikativ inversen Elements von a modulo einer Zweierpotenz m = 2k ist folgende Funktion inv2. Die Berechnung beruht darauf, dass jeweils das inverse Element von a modulo einer Zweierpotenz 2i zu dem inversen Element von a modulo der Zweierpotenz 22i geliftet wird (sogenannte Hensel-Liftung). Ausgegangen wird vom inversen Element von a (a ungerade) modulo 2; dies ist stets 1. Das Verfahren ähnelt dem Newton-Verfahren zur Berechnung des Kehrwerts.
Auch hier lassen sich die Berechnung von m = 2k und die Reduktionen modulo m durch Bit-Operationen implementieren (siehe Funktion inv2s.
Die Funktion inv2 hat eine Zeitkomplexität von O(log(k)) = O(log(log(m))), im Vergleich zur Zeitkomplexität von O(log(m)) des erweiterten euklidischen Algorithmus.
In der Kryptografie kommt die modulare Exponentiation als häufige Rechenoperation vor. Die beteiligten Zahlen sind sehr groß, und entsprechend aufwendig ist die modulo-Operation, für die normalerweise eine Division erforderlich ist.
Bei der Methode von Montgomery wird statt im Ring ℤn in einem isomorphen Ring gerechnet, dabei tritt an die Stelle der normalen modularen Multiplikation die Montgomery-Multiplikation. Diese lässt sich ohne die bei der normalen modularen Multiplikation erforderliche Division durchführen. Benutzt werden lediglich Addition, Multiplikation und mod- und div-Operationen modulo einer Zweierpotenz. Bei binärer Zahlendarstellung sind diese letzteren Operationen sehr einfach zu realisieren.
Besonders interessant ist die Montgomery-Multiplikation bei Arithmetik mit Langzahlen, die als Arrays von 32-Bit-Wörtern dargestellt sind.
[Mont 85] P. Montgomery: Modular Multiplication Without Trial Division. Mathematics of Computation, Vol. 44, 170, 519-521 (1985)
Weiter mit: [Montgomery-Multiplikation in Java] oder [up]