Signatur
Beschreibung
sodium_crypto_core_ristretto255_scalar_sub() berechnet die Differenz zweier Skalare im Skalarfeld der Ristretto255-Kurve (modulo dem Gruppenordnungsprim). Das Ergebnis ist wieder ein gültiger Skalar in diesem Feld. Die Funktion ist Teil der libsodium-Unterstützung für Ristretto255, eine kryptografisch sichere Primgruppe, die auf Curve25519 basiert.
Skalare im Ristretto255-Kontext sind 32-Byte-Binärstrings, die ganze Zahlen modulo der Gruppenordnung L darstellen. Die Subtraktion erfolgt daher modular: Wenn das Ergebnis negativ wäre, wird automatisch L addiert, sodass das Ergebnis stets im Bereich [0, L-1] liegt.
Typische Einsatzgebiete sind Zero-Knowledge-Protokolle, verifiable random functions (VRF), blinde Signaturen und andere erweiterte kryptografische Protokolle, bei denen arithmetische Operationen auf Skalaren im diskreten Logarithmusproblem benötigt werden.
Skalare sollten mit sodium_crypto_core_ristretto255_scalar_random() oder sodium_crypto_core_ristretto255_scalar_reduce() erzeugt bzw. normalisiert werden, um sicherzustellen, dass sie gültige Feldwerte darstellen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $x Pflicht | string | Der Minuend als binärer String mit genau 32 Bytes – ein gültiger Skalar im Ristretto255-Skalarfeld. | |
| $y Pflicht | string | Der Subtrahend als binärer String mit genau 32 Bytes – ein gültiger Skalar im Ristretto255-Skalarfeld. |
Rückgabewert
x - y mod L darstellt. Bei ungültiger Eingabelänge wird eine SodiumException ausgelöst.Beispiele
Einfache Skalarsubtraktion mit zufälligen Werten
<?php
// Zwei zufällige Skalare erzeugen
$x = sodium_crypto_core_ristretto255_scalar_random();
$y = sodium_crypto_core_ristretto255_scalar_random();
// Subtraktion: z = x - y mod L
$z = sodium_crypto_core_ristretto255_scalar_sub($x, $y);
echo 'Länge des Ergebnisses: ' . strlen($z) . ' Bytes' . PHP_EOL;
echo 'Ergebnis (hex): ' . sodium_bin2hex($z) . PHP_EOL;
// Probe: z + y muss wieder x ergeben
$check = sodium_crypto_core_ristretto255_scalar_add($z, $y);
echo 'Konsistenz: ' . ($check === $x ? 'OK' : 'FEHLER') . PHP_EOL;
Anwendung in einem einfachen blinden Signaturschema
<?php
// Szenario: Blinding / Unblinding eines Skalars
// Geheimschlüssel (Skalar)
$secretKey = sodium_crypto_core_ristretto255_scalar_random();
// Blind-Faktor
$blindFactor = sodium_crypto_core_ristretto255_scalar_random();
// Blinding: blindedKey = secretKey + blindFactor
$blindedKey = sodium_crypto_core_ristretto255_scalar_add($secretKey, $blindFactor);
// Unblinding: recovered = blindedKey - blindFactor
$recovered = sodium_crypto_core_ristretto255_scalar_sub($blindedKey, $blindFactor);
if ($recovered === $secretKey) {
echo 'Unblinding erfolgreich: Originalschlüssel wiederhergestellt.' . PHP_EOL;
} else {
echo 'Fehler beim Unblinding!' . PHP_EOL;
}
// Wichtig · Fallstricke
Eingabelänge: Beide Parameter müssen exakt 32 Bytes lang sein. Kürzere oder längere Strings führen zu einer SodiumException. Strings sollten stets als Binärstrings behandelt werden – nicht als UTF-8-Zeichenketten.
Modulare Arithmetik: Die Subtraktion erfolgt modulo der Gruppenordnung L der Ristretto255-Kurve. Ein negatives Ergebnis wird automatisch in den Bereich [0, L-1] gebracht – das Ergebnis ist daher immer ein gültiger Skalar.
Verfügbarkeit: Die Funktion ist nur verfügbar, wenn PHP mit libsodium >= 1.0.18 und der Konstante SODIUM_CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES kompiliert wurde. Prüfe die Verfügbarkeit zur Laufzeit mit function_exists('sodium_crypto_core_ristretto255_scalar_sub').