Start · Sprachen · PHP · Referenz · gmp_invert

gmp_invert

Funktion

Berechnet das modulare Inverse einer Zahl, d. h. den Wert <code>x</code> so dass <code>(num * x) % modulus == 1</code>.

seit PHP 4.0.4 Kategorie: math

Signatur

gmp_invert(GMP|int|string $num, GMP|int|string $modulus): GMP|false

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

Typ
GMP|false
Beschreibung
Gibt ein 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.';
}
5

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);
}
Kein Inverses: gcd(6, 9) = 3

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!';
}
d = 2753

// 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.