Signatur
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
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);
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);
// 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.