Signatur
Beschreibung
gmp_powm() führt eine modulare Potenzierung durch: Es berechnet den Rest der Division von baseexp durch mod. Das entspricht mathematisch dem Ausdruck (base ^ exp) mod mod. Die Funktion ist besonders effizient, da sie intern den Exponenten schrittweise reduziert, anstatt zunächst das vollständige Potenzierungsergebnis zu berechnen.
Modulare Potenzierung ist ein zentrales Werkzeug in der Kryptographie: RSA-Verschlüsselung, Diffie-Hellman-Schlüsselaustausch und viele andere asymmetrische Verfahren basieren genau auf dieser Operation. Mit PHP-Bordmitteln wäre eine solche Berechnung für große Zahlen aufgrund von Überlauf und Speicherbedarf nicht möglich – die GMP-Erweiterung ermöglicht beliebig große ganze Zahlen.
Alle drei Parameter können als GMP-Objekt, als PHP-int oder als dezimaler string übergeben werden. Der Exponent exp muss nicht negativ sein; negative Exponenten führen zu einem Fehler. Der Modulus mod muss von null verschieden sein.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $base Pflicht | GMP|int|string | Die Basis der Potenzierung. Kann ein GMP-Objekt, ein int oder ein dezimaler string sein. |
|
| $exp Pflicht | GMP|int|string | Der Exponent (Hochzahl). Muss größer oder gleich null sein. Negative Werte erzeugen einen Fehler. | |
| $mod Pflicht | GMP|int|string | Der Modulus. Darf nicht null sein, da sonst eine Division durch null auftreten würde und ein Fehler geworfen wird. |
Rückgabewert
GMP-Objekt zurück, das den Wert (base ^ exp) mod mod enthält. Das Ergebnis kann mit gmp_strval() oder durch eine Typumwandlung in einen String umgewandelt werden.Beispiele
Einfache modulare Potenzierung
<?php
// Berechne 2^10 mod 1000 = 1024 mod 1000 = 24
$result = gmp_powm(2, 10, 1000);
echo gmp_strval($result); // 24
RSA-ähnliche Entschlüsselung mit großen Zahlen
<?php
// Vereinfachtes RSA-Beispiel: m = c^d mod n
// In echter RSA wären diese Zahlen hunderte Stellen lang
$c = gmp_init('12345678901234567890'); // Chiffretext
$d = gmp_init('65537'); // Privater Exponent
$n = gmp_init('99999999999999999983'); // RSA-Modulus (prim in echtem RSA)
$m = gmp_powm($c, $d, $n);
echo 'Entschlüsselt: ' . gmp_strval($m);
Primzahltest nach Fermat (probabilistisch)
<?php
// Fermats kleiner Satz: wenn p prim, dann a^(p-1) ≡ 1 (mod p)
function fermat_test(int $p, int $a = 2): bool {
$result = gmp_powm($a, $p - 1, $p);
return gmp_cmp($result, 1) === 0;
}
$candidates = [17, 18, 19, 20, 97];
foreach ($candidates as $n) {
$isProbablyPrime = fermat_test($n) ? 'wahrscheinlich prim' : 'nicht prim';
echo "$n: $isProbablyPrime\n";
}
// Wichtig · Fallstricke
Sicherheitshinweis: Für kryptographische Anwendungen sollten Sie keine eigene Implementierung auf Basis von gmp_powm() bauen, wenn etablierte Bibliotheken (z. B. OpenSSL über openssl_*-Funktionen) verfügbar sind. Eigene Krypto-Implementierungen sind anfällig für Timing-Angriffe und andere Seitenkanal-Attacken.
Ein negativer Exponent (exp < 0) führt seit PHP 8.0 zu einem ValueError. In älteren PHP-Versionen kann das Verhalten abweichen. Ebenso wirft ein Modulus von 0 einen ValueError.
Die Funktion gehört zur GMP-Erweiterung, die in PHP mit der Kompilierungsoption --with-gmp aktiviert werden muss. Auf vielen Serverkonfigurationen ist sie standardmäßig verfügbar; prüfen Sie dies mit extension_loaded('gmp').