Start · Sprachen · PHP · Referenz · sodium_crypto_core_ristretto255_scalar_reduce

sodium_crypto_core_ristretto255_scalar_reduce

Funktion

Reduziert einen 64-Byte-Skalarwert modulo der Gruppenordnung der Ristretto255-Kurve auf einen kanonischen 32-Byte-Skalar.

seit PHP 7.4.0 Kategorie: crypto

Signatur

sodium_crypto_core_ristretto255_scalar_reduce(string $s): string

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

Typ
string
Beschreibung
Gibt einen 32-Byte-String zurück, der den kanonisch reduzierten Skalarwert modulo der Ristretto255-Gruppenordnung repräsentiert. Bei ungültiger Eingabelänge wird eine 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;
Skalarlänge: 32 Byte Skalar (hex): <32-Byte-Hex-Wert, je nach Eingabe unterschiedlich>

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;
}
Punkt erfolgreich berechnet: <64-Byte-Hex-Wert>

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