Start · Sprachen · PHP · Referenz · sodium_crypto_core_ristretto255_scalar_sub

sodium_crypto_core_ristretto255_scalar_sub

Funktion

Subtrahiert zwei Skalare im Ristretto255-Skalarfeld und gibt das Ergebnis als binären String zurück.

seit PHP 7.4.0 Kategorie: crypto

Signatur

sodium_crypto_core_ristretto255_scalar_sub(string $x, string $y): string

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

Typ
string
Beschreibung
Gibt einen 32-Byte-Binärstring zurück, der das Ergebnis der modularen Subtraktion x - y mod L darstellt. Bei ungültiger Eingabelänge wird eine SodiumException ausgelöst.

Beispiele

Einfache Skalarsub­traktion 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;
Länge des Ergebnisses: 32 Bytes Ergebnis (hex): <32-Byte-Hex-Wert> Konsistenz: OK

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;
}
Unblinding erfolgreich: Originalschlüssel wiederhergestellt.

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