Start · Sprachen · PHP · Referenz · sodium_crypto_core_ristretto255_from_hash

sodium_crypto_core_ristretto255_from_hash

Funktion

Bildet einen 64-Byte-Hash-Wert deterministisch auf einen gültigen Ristretto255-Punkt ab.

seit PHP 7.4.0 Kategorie: crypto

Signatur

sodium_crypto_core_ristretto255_from_hash(string $r): string

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

Typ
string
Beschreibung
Gibt einen 32-Byte-String zurück, der einen gültigen Ristretto255-Gruppenelementpunkt codiert (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;
Hash-Länge: 64 Bytes Punkt-Länge: 32 Bytes Punkt (hex): <32-Byte-Hex-Wert>

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;
Verblindeter Punkt (hex): <32-Byte-Hex-Wert>

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