Signatur
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
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);
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);
// 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.