Start · Sprachen · PHP · Referenz · sodium_crypto_scalarmult_ristretto255

sodium_crypto_scalarmult_ristretto255

Funktion

Berechnet ein gemeinsames Geheimnis (Diffie-Hellman-artiger Schlüsselaustausch) über die Ristretto255-Gruppe mittels Skalar-Multiplikation.

seit PHP 8.1.0 Kategorie: crypto

Signatur

sodium_crypto_scalarmult_ristretto255(string $n, string $p): string

Beschreibung

sodium_crypto_scalarmult_ristretto255 führt eine Skalar-Multiplikation auf der Ristretto255-Gruppe durch: Es multipliziert einen Skalar $n mit einem Punkt $p auf der Kurve und liefert das Ergebnis als neuen Kurvenpunkt. Dies ist die Grundoperation für elliptische-Kurven-Diffie-Hellman (ECDH) und andere kryptografische Protokolle.

Ristretto255 ist eine prime-order-Gruppe, die auf der Curve25519 (genauer: Edwards25519) basiert und cofactor-bezogene Sicherheitsprobleme vermeidet. Sie eignet sich besonders für Protokolle, die eine prime-order-Gruppe zwingend erfordern, etwa bestimmte Zero-Knowledge-Beweise, OPAQUE oder VOPRF.

Ein typisches ECDH-Szenario: Alice besitzt ihren privaten Schlüssel (Skalar) und Bob's öffentlichen Schlüssel (Punkt). Sie ruft diese Funktion auf, um ein gemeinsames Geheimnis zu erhalten – Bob erhält dasselbe Ergebnis, wenn er seinen privaten Schlüssel mit Alice' öffentlichem Schlüssel verrechnet.

Die Funktion arbeitet auf rohen Binärstrings der definierten Länge (SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES für $n und SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_BYTES für $p). Ungültige Punkte (z. B. der Null-Punkt) führen zu einer SodiumException.

Parameter

Name Typ Default Beschreibung
$n Pflicht string Der Skalar als binärer String. Muss exakt SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES (32) Bytes lang sein. In der Regel der eigene private Schlüssel.
$p Pflicht string Ein gültiger Ristretto255-Kurvenpunkt als binärer String. Muss exakt SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_BYTES (32) Bytes lang sein. In der Regel der öffentliche Schlüssel der Gegenseite.

Rückgabewert

Typ
string
Beschreibung
Gibt den resultierenden Ristretto255-Kurvenpunkt (gemeinsames Geheimnis) als binären String der Länge SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_BYTES (32 Bytes) zurück. Wirft eine SodiumException, wenn $p kein gültiger Punkt ist oder das Ergebnis der Identitätspunkt (Null-Punkt) wäre.

Beispiele

ECDH-Schlüsselaustausch mit Ristretto255

<?php
// Alice erzeugt ihr Schlüsselpaar
$alice_scalar = sodium_crypto_scalarmult_ristretto255_scalar_random();
$alice_public = sodium_crypto_scalarmult_ristretto255_base($alice_scalar);

// Bob erzeugt sein Schlüsselpaar
$bob_scalar = sodium_crypto_scalarmult_ristretto255_scalar_random();
$bob_public = sodium_crypto_scalarmult_ristretto255_base($bob_scalar);

// Alice berechnet das gemeinsame Geheimnis
$shared_alice = sodium_crypto_scalarmult_ristretto255($alice_scalar, $bob_public);

// Bob berechnet das gemeinsame Geheimnis
$shared_bob = sodium_crypto_scalarmult_ristretto255($bob_scalar, $alice_public);

// Beide Geheimnisse müssen identisch sein
if (sodium_memcmp($shared_alice, $shared_bob) === 0) {
    echo 'Gemeinsames Geheimnis erfolgreich ausgetauscht!' . PHP_EOL;
    echo 'Hex: ' . sodium_bin2hex($shared_alice) . PHP_EOL;
} else {
    echo 'Fehler: Geheimnisse stimmen nicht überein!' . PHP_EOL;
}
Gemeinsames Geheimnis erfolgreich ausgetauscht! Hex: <32-Byte-Zufallswert als Hex>

Fehlerbehandlung bei ungültigem Punkt

<?php
$scalar = sodium_crypto_scalarmult_ristretto255_scalar_random();

// Absichtlich ungültiger Punkt (32 Null-Bytes = Identitätspunkt)
$invalid_point = str_repeat("\x00", SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_BYTES);

try {
    $result = sodium_crypto_scalarmult_ristretto255($scalar, $invalid_point);
    echo 'Ergebnis: ' . sodium_bin2hex($result) . PHP_EOL;
} catch (SodiumException $e) {
    echo 'Fehler abgefangen: ' . $e->getMessage() . PHP_EOL;
}
Fehler abgefangen: sodium_crypto_scalarmult_ristretto255(): bad point

// Wichtig · Fallstricke

Sicherheitshinweis: Das Ergebnis dieser Funktion sollte niemals direkt als symmetrischer Schlüssel verwendet werden. Leite daraus immer einen Schlüssel ab, z. B. mit sodium_crypto_generichash oder einer geeigneten KDF (Key Derivation Function), um sicherzustellen, dass der Schlüssel gleichmäßig verteilt und von der Gruppenstruktur unabhängig ist.

Validierung: Stelle sicher, dass empfangene öffentliche Schlüssel (Punkte) mit sodium_crypto_core_ristretto255_is_valid_point geprüft werden, bevor sie an diese Funktion übergeben werden, um Small-Subgroup- und Invalid-Point-Angriffe zu verhindern.

Verfügbarkeit: Diese Funktion erfordert PHP 8.1 oder neuer sowie libsodium >= 1.0.18. Prüfe die Verfügbarkeit über defined('SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_BYTES').

Unterschied zu sodium_crypto_scalarmult: Die Standard-Funktion sodium_crypto_scalarmult nutzt X25519 (Montgomery-Kurve, cofactor 8), während Ristretto255 eine prime-order-Abstraktion bietet und für fortgeschrittene kryptografische Protokolle vorzuziehen ist.