Start · Sprachen · PHP · Referenz · sodium_crypto_core_ristretto255_sub

sodium_crypto_core_ristretto255_sub

Funktion

Subtrahiert zwei Ristretto255-Gruppenelemente und gibt das Ergebnis als Byte-String zurück.

seit PHP 8.1.0 Kategorie: crypto

Signatur

sodium_crypto_core_ristretto255_sub(string $p, string $q): string

Beschreibung

sodium_crypto_core_ristretto255_sub führt die Gruppensubtraktion auf der Ristretto255-Kurve durch. Das bedeutet, dass das Negation des zweiten Punktes q mit dem ersten Punkt p addiert wird: result = p + (-q). Das Ergebnis ist wieder ein gültiger Punkt auf der Ristretto255-Kurve.

Ristretto255 ist eine kryptografische Gruppe, die auf der elliptischen Kurve Curve25519 aufbaut und eine sichere, fehlerresistente Punkt-Arithmetik ermöglicht. Im Gegensatz zu rohen Kurvenoperationen stellt Ristretto sicher, dass jeder codierte Punkt eindeutig einem Gruppenelement entspricht, was Angriffe durch schwache Punkte oder kleine Untergruppen vermeidet.

Diese Funktion wird typischerweise in fortgeschrittenen kryptografischen Protokollen eingesetzt, wie etwa bei Zero-Knowledge-Beweisen, Commitment-Schemata, OPAQUE-Protokollen oder verteilten Schlüsselgenerierungsverfahren (DKG), bei denen Gruppenelemente addiert oder subtrahiert werden müssen.

Beide Eingabepunkte müssen gültige, komprimierte Ristretto255-Punkte (je 32 Byte) sein. Ungültige Punkte führen zu einer SodiumException.

Parameter

Name Typ Default Beschreibung
$p Pflicht string Der erste Ristretto255-Punkt als komprimierter 32-Byte-String (Minuend). Muss ein gültiger Punkt auf der Ristretto255-Kurve sein.
$q Pflicht string Der zweite Ristretto255-Punkt als komprimierter 32-Byte-String (Subtrahend). Muss ein gültiger Punkt auf der Ristretto255-Kurve sein.

Rückgabewert

Typ
string
Beschreibung
Gibt einen 32-Byte-String zurück, der den resultierenden Ristretto255-Gruppenpunkt p - q repräsentiert. Wirft eine SodiumException, wenn einer der Eingabepunkte ungültig ist.

Beispiele

Einfache Gruppensubtraktion zweier Ristretto255-Punkte

<?php
// Zwei zufällige skalare Werte erzeugen
$scalar1 = sodium_crypto_core_ristretto255_scalar_random();
$scalar2 = sodium_crypto_core_ristretto255_scalar_random();

// Basispunkt mit den Skalaren multiplizieren, um gültige Punkte zu erhalten
$p = sodium_crypto_scalarmult_ristretto255_base($scalar1);
$q = sodium_crypto_scalarmult_ristretto255_base($scalar2);

// Subtraktion: result = p - q
$result = sodium_crypto_core_ristretto255_sub($p, $q);

echo 'Ergebnis (hex): ' . sodium_bin2hex($result) . PHP_EOL;
echo 'Länge: ' . strlen($result) . ' Bytes' . PHP_EOL;
Ergebnis (hex): <32-Byte-Hex-Wert, zufällig> Länge: 32 Bytes

Verifikation: p - p muss der neutrale Punkt (Identität) sein

<?php
// Einen zufälligen Punkt erzeugen
$scalar = sodium_crypto_core_ristretto255_scalar_random();
$p = sodium_crypto_scalarmult_ristretto255_base($scalar);

// p - p sollte der neutrale Punkt (Nullpunkt) ergeben
$result = sodium_crypto_core_ristretto255_sub($p, $p);

// Der neutrale Punkt ist 32 Nullbytes
$identity = str_repeat("\x00", 32);

if ($result === $identity) {
    echo 'Korrekt: p - p ergibt den neutralen Punkt.' . PHP_EOL;
} else {
    echo 'Fehler: Ergebnis ungleich Identität.' . PHP_EOL;
}

// Gegenprobe: Subtraktion und Addition müssen sich aufheben
$scalar2 = sodium_crypto_core_ristretto255_scalar_random();
$q = sodium_crypto_scalarmult_ristretto255_base($scalar2);

$diff = sodium_crypto_core_ristretto255_sub($p, $q); // p - q
$restored = sodium_crypto_core_ristretto255_add($diff, $q); // (p - q) + q

if ($restored === $p) {
    echo 'Korrekt: (p - q) + q = p' . PHP_EOL;
}
Korrekt: p - p ergibt den neutralen Punkt. Korrekt: (p - q) + q = p

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Beide Eingabepunkte müssen stets auf Gültigkeit geprüft werden. Ungültige oder manipulierte Punkte können zu einem schwachen oder vorhersehbaren Ergebnis führen. Die Funktion wirft bei ungültigen Punkten eine SodiumException – diese sollte immer abgefangen werden.
  • Ristretto255-Operationen sollten niemals direkt mit rohen Curve25519-Punkten gemischt werden. Nutze ausschließlich die sodium_crypto_core_ristretto255_*-Funktionen, um Kompatibilität und Sicherheit zu gewährleisten.
  • Diese Funktion ist Teil der libsodium-Erweiterung und setzt PHP 8.1 oder neuer sowie eine ausreichend aktuelle Version der libsodium-Bibliothek (≥ 1.0.18) voraus. Prüfe die Verfügbarkeit mit defined('SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES').
  • Der neutrale Punkt (Identitätselement) wird als 32 Nullbytes codiert. Prüfe Ergebnisse auf den neutralen Punkt, wenn dies für dein Protokoll relevant ist.