Start · Sprachen · PHP · Referenz · bcpowmod

bcpowmod

Funktion

Berechnet <code>base^exponent mod modulus</code> für beliebig große ganze Zahlen mit der BCMath-Bibliothek.

seit PHP 5.0.0 Kategorie: math

Signatur

bcpowmod(string $base, string $exponent, string $modulus, ?int $scale = null): string|false

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

Typ
string|false
Beschreibung
Gibt das Ergebnis von 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
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')
Entschlüsselte Nachricht: 65

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.