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