Signatur
Beschreibung
gmp_invert berechnet das modulare Inverse von num bezüglich modulus. Gesucht ist ein ganzzahliger Wert x, für den gilt: (num * x) mod modulus ≡ 1. Dieses Konzept stammt aus der modularen Arithmetik und ist ein grundlegender Baustein in der Kryptographie (z. B. RSA-Schlüsselerzeugung).
Das Inverse existiert nur dann, wenn num und modulus teilerfremd sind (ihr größter gemeinsamer Teiler ist 1). Ist das nicht der Fall, gibt die Funktion false zurück. Mit gmp_gcd kann man die Teilerfremdheit vorab prüfen.
Die Funktion akzeptiert als Argumente sowohl GMP-Objekte (wie sie z. B. von gmp_init erzeugt werden) als auch PHP-Integer oder numerische Strings. Das Ergebnis ist stets ein GMP-Objekt, das mit gmp_strval oder gmp_intval in einen lesbaren Wert umgewandelt werden kann.
Typische Anwendungen sind kryptographische Berechnungen wie die Erzeugung privater RSA-Schlüssel, das Lösen von linearen Kongruenzen sowie Anwendungen im Bereich des chinesischen Restsatzes (CRT).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num Pflicht | GMP|int|string | Die Zahl, deren modulares Inverses berechnet werden soll. Kann ein GMP-Objekt, ein PHP-Integer oder ein numerischer String sein. |
|
| $modulus Pflicht | GMP|int|string | Der Modulus, bezüglich dessen das Inverse berechnet wird. Muss größer als 0 sein. Kann ein GMP-Objekt, ein PHP-Integer oder ein numerischer String sein. |
Rückgabewert
GMP-Objekt zurück, das das modulare Inverse darstellt, wenn num und modulus teilerfremd sind. Gibt false zurück, wenn kein Inverses existiert (d. h. gcd(num, modulus) != 1).Beispiele
Einfaches modulares Inverses berechnen
<?php
// Gesucht: x mit (3 * x) mod 7 == 1
$result = gmp_invert(3, 7);
if ($result !== false) {
echo gmp_strval($result); // Ausgabe: 5, denn 3 * 5 = 15 ≡ 1 (mod 7)
} else {
echo 'Kein Inverses vorhanden.';
}
Prüfung auf Existenz des Inversen mit gmp_gcd
<?php
$num = gmp_init(6);
$modulus = gmp_init(9);
// Vorprüfung: sind num und modulus teilerfremd?
$gcd = gmp_gcd($num, $modulus);
if (gmp_cmp($gcd, 1) !== 0) {
echo "Kein Inverses: gcd(6, 9) = " . gmp_strval($gcd);
} else {
$inv = gmp_invert($num, $modulus);
echo gmp_strval($inv);
}
Einsatz im RSA-ähnlichen Kontext (d aus e und phi)
<?php
// Vereinfachtes RSA-Beispiel: p=61, q=53
$p = gmp_init(61);
$q = gmp_init(53);
$n = gmp_mul($p, $q); // n = 3233
$phi = gmp_mul(
gmp_sub($p, 1),
gmp_sub($q, 1)
); // phi = 3120
$e = gmp_init(17); // öffentlicher Exponent
// Privater Exponent d: (e * d) mod phi == 1
$d = gmp_invert($e, $phi);
if ($d !== false) {
echo 'd = ' . gmp_strval($d);
} else {
echo 'e und phi sind nicht teilerfremd!';
}
// Wichtig · Fallstricke
Sicherheitshinweis: In kryptographischen Anwendungen sollte das Ergebnis von gmp_invert nie direkt in unsicherem Kontext ausgegeben werden. Private Schlüsselmaterialien müssen sicher verwaltet und gespeichert werden.
Randfälle: Ist modulus gleich 1, ist das Ergebnis immer 0 (da jede Zahl mod 1 gleich 0 ist). Ist num negativ, wird es intern automatisch in den positiven Bereich des Modulus überführt. Bei modulus = 0 wird ein Laufzeitfehler ausgelöst.
Die GMP-Erweiterung muss auf dem Server aktiviert sein. Seit PHP 5.6 werden GMP-Ressourcen als Objekte behandelt.