Signatur
Beschreibung
sodium_crypto_core_ristretto255_from_hash() ist eine sogenannte Hash-to-Point-Funktion: Sie nimmt einen 64-Byte-Eingabevektor (z. B. die Ausgabe von sodium_crypto_generichash() mit 64 Byte Ausgabelänge) und bildet ihn auf einen Punkt der Ristretto255-Kurve ab. Das Ergebnis ist ein 32-Byte-String, der einen gültigen Gruppenelementkodierung der elliptischen Kurve darstellt.
Diese Funktion ist besonders nützlich in kryptographischen Protokollen, bei denen Daten (z. B. Passwörter, Identitäten oder Nachrichten) in Kurven-Punkte umgewandelt werden müssen – etwa für Oblivious PRF (OPRF), Password-Authenticated Key Exchange (PAKE) oder Zero-Knowledge-Protokolle. Der Prozess ist deterministisch: gleicher Input ergibt immer denselben Punkt.
Ristretto255 ist eine Abstraktion über Curve25519, die eine saubere Primordnungsgruppe ohne Kleinteilerproblem bietet. Im Gegensatz zu rohen Edwards-Koordinaten ist die Ristretto-Codierung eindeutig und cofaktor-sicher, was viele kryptographische Protokolle vereinfacht.
Die Funktion ist Teil der libsodium-Bibliothek und steht in PHP über die sodium-Erweiterung zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $r Pflicht | string | Ein 64-Byte-String, der als Eingabevektor dient – typischerweise die Ausgabe einer kryptographischen Hash-Funktion wie sodium_crypto_generichash() mit 64 Byte Länge. Muss exakt SODIUM_CRYPTO_CORE_RISTRETTO255_HASHBYTES (64) Bytes lang sein. |
Rückgabewert
SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES). Bei ungültiger Eingabelänge wird eine SodiumException geworfen.Beispiele
Hash-Wert auf einen Ristretto255-Punkt abbilden
<?php
// 64-Byte-Hash eines Passworts oder einer Nachricht erzeugen
$input = 'mein_geheimes_passwort';
$hash = sodium_crypto_generichash($input, '', SODIUM_CRYPTO_GENERICHASH_BYTES_MAX);
// 64-Byte-Hash als Längenprüfung
echo 'Hash-Länge: ' . strlen($hash) . ' Bytes' . PHP_EOL;
// Auf Ristretto255-Punkt abbilden
$point = sodium_crypto_core_ristretto255_from_hash($hash);
echo 'Punkt-Länge: ' . strlen($point) . ' Bytes' . PHP_EOL;
echo 'Punkt (hex): ' . sodium_bin2hex($point) . PHP_EOL;
Verwendung in einem einfachen OPRF-Schritt
<?php
// Simulierter OPRF-Einstieg: Nutzer-Eingabe -> Kurvenpunkt
$userId = 'benutzer@example.com';
$password = 'sicheresPasswort123';
// Kombinierten Hash bilden (Domain-Separation empfohlen)
$domainTag = 'meinApp-oprf-v1';
$hashInput = $domainTag . $userId . $password;
// 64-Byte-Hash erzeugen
$hash64 = sodium_crypto_generichash($hashInput, '', 64);
// Auf Ristretto255-Punkt abbilden
$point = sodium_crypto_core_ristretto255_from_hash($hash64);
// Punkt kann nun mit einem skalaren Blind-Faktor multipliziert werden
$scalar = sodium_crypto_core_ristretto255_scalar_random();
$blindedPoint = sodium_crypto_scalarmult_ristretto255($scalar, $point);
echo 'Verblindeter Punkt (hex): ' . sodium_bin2hex($blindedPoint) . PHP_EOL;
// Wichtig · Fallstricke
Eingabelänge: Der Parameter $r muss exakt 64 Bytes lang sein (SODIUM_CRYPTO_CORE_RISTRETTO255_HASHBYTES). Eine abweichende Länge führt zu einer SodiumException. Verwende immer sodium_crypto_generichash() mit explizit gesetzter Ausgabelänge von 64 Bytes.
Sicherheitshinweis: Verwende keine ungehashten oder kurzen Eingaben direkt als $r. Der Eingabevektor sollte eine gleichmäßige Verteilung über 64 Bytes haben; andernfalls kann die Abbildung vorhersehbar sein. Für Passwort-basierte Protokolle empfiehlt sich vorheriges Key-Stretching (z. B. mit sodium_crypto_pwhash()).
Determinismus: Die Funktion ist deterministisch – gleiche Eingabe ergibt immer denselben Punkt. Für Protokolle, die Unvorhersehbarkeit erfordern, muss ein zusätzlicher Zufallswert (Nonce/Salt) in die Hash-Eingabe einfließen.
Diese Funktion setzt libsodium >= 1.0.18 voraus. Prüfe die Verfügbarkeit mit defined('SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES').