Signatur
Beschreibung
sodium_crypto_core_ristretto255_scalar_reduce() nimmt einen 64-Byte-String entgegen und reduziert ihn modulo der Gruppenordnung l der Ristretto255-Elliptischen-Kurve. Das Ergebnis ist ein kanonischer 32-Byte-Skalar, der direkt in weiteren kryptographischen Operationen verwendet werden kann.
Diese Funktion ist besonders nützlich, wenn man aus einem Hashwert (z. B. SHA-512 oder BLAKE2b) einen gültigen Skalar für Ristretto255 erzeugen möchte, ohne einen Bias in der Verteilung einzuführen. Indem man einen 64-Byte-Wert (512 Bit) reduziert, erhält man eine gleichmäßig verteilte Ausgabe über die Gruppenordnung – was für sichere kryptographische Protokolle unerlässlich ist.
Die Funktion entspricht der crypto_core_ristretto255_scalar_reduce-Funktion aus der libsodium-Bibliothek und ist Teil der Ristretto255-Skalar-Arithmetik-API, die unter anderem für Zero-Knowledge-Beweise, Oblivious-Pseudorandom-Functions (OPRFs) und ähnliche Protokolle benötigt wird.
- Eingabe muss exakt 64 Byte lang sein (
SODIUM_CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES). - Ausgabe ist immer exakt 32 Byte lang (
SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $s Pflicht | string | Ein 64-Byte-String (nicht-reduzierter Skalarwert), der modulo der Gruppenordnung reduziert werden soll. Typischerweise ist dies die Ausgabe einer kryptographischen Hashfunktion wie SHA-512 oder BLAKE2b-512. |
Rückgabewert
SodiumException geworfen.Beispiele
Skalar aus SHA-512-Hash erzeugen
<?php
// Einen 64-Byte-Hash erzeugen (z. B. via SHA-512)
$hash = hash('sha512', 'Geheime Eingabe', true);
// Sicherstellen, dass der Hash 64 Byte lang ist
assert(strlen($hash) === SODIUM_CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES);
// Skalar reduzieren
$scalar = sodium_crypto_core_ristretto255_scalar_reduce($hash);
echo 'Skalarlänge: ' . strlen($scalar) . ' Byte' . PHP_EOL;
echo 'Skalar (hex): ' . bin2hex($scalar) . PHP_EOL;
Skalar für OPRF-ähnliches Protokoll vorbereiten
<?php
// Zufälligen 64-Byte-Wert generieren (z. B. als Blind-Faktor)
$randomBytes = random_bytes(64);
// Auf Gruppenordnung reduzieren, um einen gültigen Skalar zu erhalten
$scalar = sodium_crypto_core_ristretto255_scalar_reduce($randomBytes);
// Skalar für Punkt-Multiplikation verwenden
$basePoint = sodium_crypto_core_ristretto255_from_hash(str_repeat("\x00", 64));
try {
$point = sodium_crypto_scalarmult_ristretto255_base($scalar);
echo 'Punkt erfolgreich berechnet: ' . bin2hex($point) . PHP_EOL;
} catch (SodiumException $e) {
echo 'Fehler: ' . $e->getMessage() . PHP_EOL;
}
// Wichtig · Fallstricke
Eingabelänge: Die Eingabe muss exakt SODIUM_CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES (64) Byte lang sein. Eine abweichende Länge führt zu einer SodiumException.
Bias-Vermeidung: Verwende immer einen 64-Byte-Eingabewert (z. B. aus SHA-512 oder BLAKE2b-512), um einen statistisch gleichmäßig verteilten Skalar zu erhalten. Eine direkte Verwendung eines 32-Byte-Zufallswerts als Skalar kann zu einem messbaren Bias führen, da die Gruppenordnung keine Zweierpotenz ist.
Verfügbarkeit: Diese Funktion erfordert PHP ≥ 7.4 sowie eine libsodium-Version ≥ 1.0.18, die Ristretto255-Unterstützung enthält. Überprüfe die Verfügbarkeit via defined('SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES').