Start · Sprachen · PHP · Referenz · sodium_crypto_scalarmult_base

sodium_crypto_scalarmult_base

Funktion

Berechnet den öffentlichen Schlüssel aus einem gegebenen geheimen Schlüssel mittels Curve25519-Skalarmultiplikation (Alias von <code>sodium_crypto_box_publickey_from_secretkey</code>).

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_scalarmult_base(string $secret_key): string

Beschreibung

sodium_crypto_scalarmult_base ist ein Alias für sodium_crypto_box_publickey_from_secretkey und führt die sogenannte Skalarmultiplikation auf der Basis-Punkt der elliptischen Kurve Curve25519 durch. Das Ergebnis ist der öffentliche Schlüssel, der dem übergebenen privaten (geheimen) Schlüssel entspricht.

Intern multipliziert die Funktion den übergebenen 32-Byte-Skalar (geheimen Schlüssel) mit dem Basisgenerator der Curve25519-Kurve. Dies ist die Grundoperation des Diffie-Hellman-Schlüsselaustausches auf Basis von X25519. Mit dem zurückgegebenen öffentlichen Schlüssel kann dann z. B. ein gemeinsames Geheimnis mit sodium_crypto_scalarmult errechnet werden.

Typischer Anwendungsfall ist das nachträgliche Ableiten des öffentlichen Schlüssels, wenn nur der private Schlüssel vorliegt – etwa beim Austausch, bei der Speicherung oder zur Anzeige des öffentlichen Schlüssels für andere Kommunikationspartner. Der geheime Schlüssel sollte zuvor mit sodium_crypto_box_keypair oder sodium_crypto_box_secretkey erzeugt worden sein.

Parameter

Name Typ Default Beschreibung
$secret_key Pflicht string Der geheime (private) Schlüssel mit einer Länge von genau SODIUM_CRYPTO_BOX_SECRETKEYBYTES (32 Byte). Muss ein gültiger Curve25519-Privatschlüssel sein.

Rückgabewert

Typ
string
Beschreibung
Gibt den zugehörigen öffentlichen Schlüssel als binären String mit einer Länge von SODIUM_CRYPTO_BOX_PUBLICKEYBYTES (32 Byte) zurück. Bei einem ungültigen Schlüssel wird eine SodiumException geworfen.

Beispiele

Öffentlichen Schlüssel aus privatem Schlüssel ableiten

<?php
// Schlüsselpaar erzeugen
$keypair = sodium_crypto_box_keypair();
$secretKey = sodium_crypto_box_secretkey($keypair);

// Öffentlichen Schlüssel aus dem privaten Schlüssel ableiten
$publicKey = sodium_crypto_scalarmult_base($secretKey);

echo 'Öffentlicher Schlüssel (Hex): ' . bin2hex($publicKey) . PHP_EOL;
echo 'Länge: ' . strlen($publicKey) . ' Byte' . PHP_EOL;

// Vergleich mit dem originalen öffentlichen Schlüssel aus dem Keypair
$originalPublicKey = sodium_crypto_box_publickey($keypair);
var_dump(hash_equals($publicKey, $originalPublicKey)); // true

// Sicherheitshalber Speicher bereinigen
sodium_memzero($secretKey);
Öffentlicher Schlüssel (Hex): <32-Byte-Hex-String> Länge: 32 Byte bool(true)

Einsatz im X25519 Diffie-Hellman Schlüsselaustausch

<?php
// Alice erzeugt ihr Schlüsselpaar
$aliceKeypair = sodium_crypto_box_keypair();
$aliceSecret = sodium_crypto_box_secretkey($aliceKeypair);
$alicePublic = sodium_crypto_scalarmult_base($aliceSecret);

// Bob erzeugt sein Schlüsselpaar
$bobKeypair = sodium_crypto_box_keypair();
$bobSecret = sodium_crypto_box_secretkey($bobKeypair);
$bobPublic = sodium_crypto_scalarmult_base($bobSecret);

// Gemeinsames Geheimnis berechnen (beide Seiten kommen zum gleichen Ergebnis)
$sharedAlice = sodium_crypto_scalarmult($aliceSecret, $bobPublic);
$sharedBob   = sodium_crypto_scalarmult($bobSecret, $alicePublic);

var_dump(hash_equals($sharedAlice, $sharedBob)); // true
echo 'Gemeinsames Geheimnis (Hex): ' . bin2hex($sharedAlice) . PHP_EOL;

sodium_memzero($aliceSecret);
sodium_memzero($bobSecret);
bool(true) Gemeinsames Geheimnis (Hex): <32-Byte-Hex-String>

// Wichtig · Fallstricke

Sicherheitshinweis: Der geheime Schlüssel darf niemals übertragen oder unverschlüsselt gespeichert werden. Verwende sodium_memzero, um den Schlüssel nach Verwendung sicher aus dem Speicher zu löschen.

Da diese Funktion ein Alias von sodium_crypto_box_publickey_from_secretkey ist, sind beide Aufrufe semantisch identisch. Die Verwendung des semantisch klareren Alias hängt vom Kontext ab: sodium_crypto_scalarmult_base betont die mathematische Grundoperation, während sodium_crypto_box_publickey_from_secretkey den Zweck im Box-Kontext verdeutlicht.

Die Funktion erwartet exakt 32 Byte als Eingabe. Ein falsches Schlüsselformat führt zu einer SodiumException. Schlüssel sollten ausschließlich mit den dafür vorgesehenen Libsodium-Funktionen erzeugt werden.