Signatur
Beschreibung
bcpowmod() berechnet den Rest einer Potenz-Division (modulare Exponentiation): base ^ exponent mod modulus. Alle Operanden werden als Zeichenketten übergeben, um beliebig große ganze Zahlen exakt verarbeiten zu können. Die Funktion ist gegenüber der naiven Kombination von bcpow() und bcmod() erheblich effizienter, da sie den Modulo-Schritt intern nach jedem Multiplikationsschritt anwendet (Square-and-Multiply-Algorithmus) und so riesige Zwischenergebnisse vermeidet.
Der typische Einsatzbereich liegt in der Kryptographie, etwa beim RSA-Algorithmus, bei Diffie-Hellman-Schlüsselaustausch oder anderen Public-Key-Verfahren, bei denen modulare Exponentiation mit sehr großen Zahlen (Hunderte bis Tausende Stellen) erforderlich ist.
Der Parameter scale gibt die Anzahl der Nachkommastellen an. Da bcpowmod() nur mit ganzen Zahlen arbeitet, sollte er auf 0 gesetzt oder weggelassen werden — Nachkommastellen werden intern abgeschnitten. Der exponent muss nicht-negativ sein und der modulus muss ungleich null sein, andernfalls gibt die Funktion false zurück.
Ohne die BCMath-Erweiterung steht diese Funktion nicht zur Verfügung. Sie kann bei der PHP-Kompilierung mit --enable-bcmath aktiviert werden und ist in vielen Standard-Distributionen bereits enthalten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $base Pflicht | string | Die Basis der Potenz als numerische Zeichenkette. Kann beliebig groß sein. | |
| $exponent Pflicht | string | Der Exponent als numerische Zeichenkette. Muss eine nicht-negative ganze Zahl sein. | |
| $modulus Pflicht | string | Der Divisor für die Modulo-Operation als numerische Zeichenkette. Darf nicht 0 sein. |
|
| $scale | ?int | null | Anzahl der Dezimalstellen im Ergebnis. Für bcpowmod() sollte dieser Wert 0 sein oder weggelassen werden, da die Funktion intern nur mit ganzen Zahlen arbeitet. Wird null übergeben, gilt der globale BCMath-Scale-Wert. |
Rückgabewert
base ^ exponent mod modulus als Zeichenkette zurück. Gibt false zurück, wenn modulus gleich 0 ist, exponent negativ ist oder ein Parameter keine gültige numerische Zeichenkette ist.Beispiele
Einfache modulare Exponentiation
<?php
// Berechnet: 2^10 mod 1000 = 1024 mod 1000 = 24
$ergebnis = bcpowmod('2', '10', '1000', 0);
echo $ergebnis; // 24
RSA-ähnliche Entschlüsselung mit großen Zahlen
<?php
// Simuliertes RSA-Beispiel (stark vereinfacht, keine echten Schlüssel!):
// c = verschlüsselter Wert, d = privater Exponent, n = Modulus
$c = '2790';
$d = '2753';
$n = '3233';
// m = c^d mod n (RSA-Entschlüsselung)
$m = bcpowmod($c, $d, $n, 0);
echo "Entschlüsselte Nachricht: " . $m;
// Ergibt 65 (ASCII 'A')
Sehr große Zahlen effizient verarbeiten
<?php
// Ohne bcpowmod würde bcpow() ein riesiges Zwischenergebnis erzeugen
$base = '123456789012345678901234567890';
$exponent = '65537'; // Typischer RSA-Exponent
$modulus = '999999999999999999999999999937'; // Eine große Primzahl
$ergebnis = bcpowmod($base, $exponent, $modulus, 0);
echo $ergebnis;
// Wichtig · Fallstricke
Sicherheitshinweis: bcpowmod() allein macht noch kein sicheres Kryptosystem. Für echte kryptographische Anwendungen sollten spezialisierte Bibliotheken wie OpenSSL (openssl_*-Funktionen) oder die GMP-Erweiterung (gmp_powm()) verwendet werden, die zusätzlich gegen Seitenkanalangriffe (Timing-Attacken) abgesichert sind.
Nur ganze Zahlen: Dezimalstellen in base, exponent oder modulus werden intern abgeschnitten, nicht gerundet. Das kann zu unerwarteten Ergebnissen führen, wenn versehentlich Gleitkommazahlen übergeben werden.
Negativer Exponent: Ein negativer exponent wird nicht unterstützt und führt zur Rückgabe von false.