Start · Sprachen · PHP · Referenz · sodium_crypto_core_ristretto255_scalar_invert

sodium_crypto_core_ristretto255_scalar_invert

Funktion

Berechnet das multiplikative Inverse eines Ristretto255-Skalars modulo der Gruppenordnung.

seit PHP 8.1.0 Kategorie: crypto

Signatur

sodium_crypto_core_ristretto255_scalar_invert(string $s): string

Beschreibung

sodium_crypto_core_ristretto255_scalar_invert() berechnet zu einem gegebenen Skalar s das multiplikative Inverse s⁻¹ bezüglich der Gruppenordnung der Ristretto255-Kurve (eine Primzahl l). Das bedeutet: s * s⁻¹ ≡ 1 (mod l).

Die Funktion ist Teil der Ristretto255-Skalararithmetik in libsodium und wird typischerweise in kryptografischen Protokollen benötigt, bei denen Punkte auf der Kurve durch Division eines skalaren Faktors "rückgängig gemacht" werden müssen – beispielsweise in OPRF-(Oblivious Pseudorandom Function-)Protokollen oder Zero-Knowledge-Beweissystemen.

Der Eingabeskalar muss genau SODIUM_CRYPTO_CORE_RISTRETTO255_SCALAR_BYTES (32) Bytes lang sein und ein gültiger, nicht-nullwertiger Skalar sein. Das Ergebnis ist ebenfalls ein 32-Byte-String, der direkt mit anderen Skalaroperationen wie sodium_crypto_core_ristretto255_scalar_mul() weiterverwendet werden kann.

Wichtig: Die Funktion operiert auf Skalaren, nicht auf Kurvenpunkten. Für die Punktmultiplikation auf der Kurve gibt es separate Funktionen wie sodium_crypto_scalarmult_ristretto255().

Parameter

Name Typ Default Beschreibung
$s Pflicht string Ein Skalarwert als Binärstring der Länge SODIUM_CRYPTO_CORE_RISTRETTO255_SCALAR_BYTES (32 Bytes). Darf nicht der Nullskalar sein.

Rückgabewert

Typ
string
Beschreibung
Gibt das multiplikative Inverse des Skalars als Binärstring mit SODIUM_CRYPTO_CORE_RISTRETTO255_SCALAR_BYTES (32) Bytes zurück. Wirft eine SodiumException, wenn der Eingabeskalar ungültig oder null ist.

Beispiele

Invertierung eines zufälligen Skalars und Verifikation

<?php
// Zufälligen nicht-null Skalar erzeugen
$s = sodium_crypto_core_ristretto255_scalar_random();

// Multiplikatives Inverses berechnen
$s_inv = sodium_crypto_core_ristretto255_scalar_invert($s);

// Verifikation: s * s^-1 muss 1 (mod l) ergeben
$product = sodium_crypto_core_ristretto255_scalar_mul($s, $s_inv);

// Das Ergebnis sollte der Skalar 1 sein (Little-Endian: 0x01 gefolgt von 31 Null-Bytes)
$scalar_one = "\x01" . str_repeat("\x00", 31);

if (sodium_memcmp($product, $scalar_one) === 0) {
    echo "Verifikation erfolgreich: s * s^-1 = 1 (mod l)" . PHP_EOL;
} else {
    echo "Fehler bei der Verifikation!" . PHP_EOL;
}

sodium_memzero($s);
sodium_memzero($s_inv);
Verifikation erfolgreich: s * s^-1 = 1 (mod l)

Einsatz in einem vereinfachten OPRF-Protokoll

<?php
// Server-seitiger geheimer Schlüssel (Skalar)
$server_key = sodium_crypto_core_ristretto255_scalar_random();

// Client: Zufälligen Blinding-Skalar erzeugen
$blind = sodium_crypto_core_ristretto255_scalar_random();

// Client: Nachricht hashen und auf den Ristretto255-Punkt mappen
$message = 'geheimes Passwort';
$hashed_point = sodium_crypto_core_ristretto255_from_hash(
    hash('sha512', $message, true)
);

// Client: Punkt mit Blinding-Skalar blenden (H(msg) * blind)
$blinded_point = sodium_crypto_scalarmult_ristretto255($blind, $hashed_point);

// --- Client sendet $blinded_point an Server ---

// Server: Mit Server-Schlüssel multiplizieren
$evaluated_point = sodium_crypto_scalarmult_ristretto255($server_key, $blinded_point);

// --- Server sendet $evaluated_point zurück ---

// Client: Blinding rückgängig machen mit Inversem des Blindings
$blind_inv = sodium_crypto_core_ristretto255_scalar_invert($blind);
$final_point = sodium_crypto_scalarmult_ristretto255($blind_inv, $evaluated_point);

// $final_point entspricht nun H(msg)^server_key — ohne dass der Server 'message' kannte
echo "OPRF-Output (hex): " . sodium_bin2hex($final_point) . PHP_EOL;

sodium_memzero($server_key);
sodium_memzero($blind);
sodium_memzero($blind_inv);
OPRF-Output (hex): <32-Byte-Hex-Wert>

// Wichtig · Fallstricke

Sicherheitshinweis: Der Nullskalar (\x00...\x00, 32 Null-Bytes) hat kein multiplikatives Inverses. Die Funktion wirft in diesem Fall eine SodiumException. Stelle sicher, dass Skalare stets mit sodium_crypto_core_ristretto255_scalar_random() oder ähnlich sicheren Methoden erzeugt werden.

Verfügbarkeit: Die Funktion erfordert PHP 8.1.0+ sowie libsodium ab Version 1.0.18. Prüfe mit defined('SODIUM_CRYPTO_CORE_RISTRETTO255_SCALAR_BYTES'), ob die Ristretto255-Unterstützung vorhanden ist.

Speicherhygiene: Skalare, die kryptografische Geheimnisse repräsentieren, sollten nach Gebrauch mit sodium_memzero() überschrieben werden, um den Speicher zu bereinigen.