Modulare Exponentiation

 aufwärts

Die modulare Exponentiation spielt allgemein in der Kryptografie eine große Rolle. Im RSA-Verfahren beispielsweise besteht die Chiffrierung in der Berechnung von me mod n. Hierbei sind m, e und n sehr große Zahlen (typischerweise 512 oder 1024 Bit lang).

Um me mod n zu berechnen, sind zum Glück nicht e Multi­plikationen von m mit sich selbst erforderlich. Schon bei einer Länge von e von nur 50 Bit wären dies eine Billiarde Multi­plikationen.

Tatsächlich genügen weniger als 2 log(e) Multi­plikationen, also weniger als 100 bei einem 50-Bit-Exponenten.

 

Idee

Ausgangspunkt ist die Auswertung der Binär­darstellung des Exponenten nach dem Horner-Schema.

So wird beispielsweise die Binär­darstellung 1101 nach dem Horner-Schema wie folgt ausgewertet:

((((0) · 2 + 1) · 2 + 1) · 2 + 0) · 2 + 1   =   13

Daraus ergibt sich unmittelbar das Verfahren zur Exponentiation, hier also zur Berechnung von m13:

m((((0) · 2 + 1) · 2 + 1) · 2 + 0) · 2 + 1   =   m13

Unter Anwendung der Regeln für die Potenzrechnung ergibt sich somit

((((m0)2 · m1)2 · m1)2 · m0)2 · m1   =   m13

 

Zur Auswertung einer k-Bit-Binärzahl sind k Multi­plikationen mit 2 und k Additionen erforderlich (bzw. sogar weniger Additionen, wenn die Addition von 0 weggelassen wird). Entsprechend sind für die Exponentiation nach diesem Verfahren bei einem k-Bit-Exponenten k Quadrate und k Multi­plikationen erforderlich (bzw. sogar weniger Multi­plikationen, wenn die Multi­plikation mit m0 = 1 weggelassen wird).

 

Programm

Die folgende Gegen­überstellung zeigt das Programm zur Auswertung einer binär dargestellten Zahl e der Länge k nach dem Horner-Schema sowie das entsprechende Programm zur Exponentiation einer Zahl m mit dem Exponenten e.

int s=0;
for (int i=k-1; i>=0; i--)
{
    s=s*2;
    if (e[i]==1)
        s=s+1;
}
 
int s=1;
for (int i=k-1; i>=0; i--)
{
    s=s*s;
    if (e[i]==1)
        s=s*m;
}

 

Aus dem zweiten dieser Programme ist das folgende Programm zur modularen Multi­plikation beliebig großer Zahlen (Java-Typ java.math.BigInteger) abgeleitet. Nach jeder Multi­plikation wird das Zwischen­ergebnis modulo n reduziert.

 

Funktion modexp
Eingabe:Zahl m, Exponent e, Modul n
Ausgabe:me mod n
Methode:
  1. BigInteger modexp(BigInteger m, BigInteger e, BigInteger n)
    {
        int k=e.bitLength();
        BigInteger s=BigInteger.ONE;
        for (int i=k-1; i>=0; i--)
        {
            s=s.multiply(s).mod(n);
            if (e.testBit(i))
                s=s.multiply(m).mod(n);
        }
        return s;
    }
    

 

 

 

Zusammenfassung

Die schnelle modulare Multi­plikation ist von fundamentaler Bedeutung in der Kryptografie, so etwa für RSA-Ver­schlüsselung und -Signatur, Diffie-Hellman-Schlüssel­vereinbarung, aber auch für den Miller-Rabin-Primzahltest.

Das hier dargestellte Verfahren zur schnellen modularen Exponentiation me mod n erfordert O(log e) Multi­plikationen und Reduktionen modulo n, d.h. die Zeit­komplexität verhält sich höchstens linear zur Länge des Exponenten in Bit.

Eine Variante des Verfahrens zur schnellen modularen Exponentiation arbeitet die Binär­darstellung beginnend beim letzten Bit ab.

Für den Miller-Rabin-Primzahltest wird das hier angegebene Verfahren benutzt, da es in der Variablen s die dort benötigte Folge von Quadratzahlen modulo n (sogenannte quadratische Reste) erzeugt.

 

 

Weiter mit:   [Primzahltest]   oder   up del.icio.us digg.com Furl Google Ma.gnolia Mister Wong StumbleUpon YahooMyWeb LinkARENA

 

homeH.W. Lang   FH Flensburg   lang@fh-flensburg.de   Impressum   ©   Created: 12.06.2001   Updated: 25.06.2009
Valid HTML 4.01 Transitional