Signatur
Beschreibung
sodium_crypto_kx_publickey() nimmt ein vollständiges crypto_kx-Schlüsselpaar (bestehend aus öffentlichem und geheimem Schlüssel) und gibt ausschließlich den öffentlichen Anteil zurück. Das Schlüsselpaar wird typischerweise mit sodium_crypto_kx_keypair() oder sodium_crypto_kx_seed_keypair() erzeugt.
Der öffentliche Schlüssel wird im Schlüsselaustausch-Protokoll (Diffie-Hellman basiert auf Curve25519) an den Kommunikationspartner übermittelt. Er kann gefahrlos weitergegeben werden, da er keine geheimen Informationen enthält.
Diese Funktion ist typischerweise Teil des crypto_kx-Workflows: Ein Client und ein Server tauschen ihre öffentlichen Schlüssel aus und leiten daraus mithilfe von sodium_crypto_kx_client_session_keys() bzw. sodium_crypto_kx_server_session_keys() gemeinsame Sitzungsschlüssel ab, ohne dass das Shared Secret jemals direkt übertragen werden muss.
Die zurückgegebene Zeichenkette hat eine feste Länge von SODIUM_CRYPTO_KX_PUBLICKEYBYTES Bytes (32 Bytes) und enthält Binärdaten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $keypair Pflicht | string | Das vollständige crypto_kx-Schlüsselpaar als binärer String, wie es von sodium_crypto_kx_keypair() oder sodium_crypto_kx_seed_keypair() erzeugt wird. Die erwartete Länge beträgt SODIUM_CRYPTO_KX_KEYPAIRBYTES Bytes (64 Bytes). |
Rückgabewert
SODIUM_CRYPTO_KX_PUBLICKEYBYTES (32 Bytes) zurück. Bei ungültiger Eingabelänge wird eine SodiumException geworfen.Beispiele
Schlüsselpaar erzeugen und öffentlichen Schlüssel extrahieren
<?php
// Schlüsselpaar generieren
$keypair = sodium_crypto_kx_keypair();
// Öffentlichen Schlüssel extrahieren
$publicKey = sodium_crypto_kx_publickey($keypair);
// Länge prüfen
echo 'Länge des öffentlichen Schlüssels: ' . strlen($publicKey) . ' Bytes' . PHP_EOL;
echo 'SODIUM_CRYPTO_KX_PUBLICKEYBYTES: ' . SODIUM_CRYPTO_KX_PUBLICKEYBYTES . PHP_EOL;
// Sicher als Hex-String ausgeben
echo 'Öffentlicher Schlüssel (Hex): ' . sodium_bin2hex($publicKey) . PHP_EOL;
Vollständiger crypto_kx-Schlüsselaustausch zwischen Client und Server
<?php
// --- Server-Seite ---
$serverKeypair = sodium_crypto_kx_keypair();
$serverPublicKey = sodium_crypto_kx_publickey($serverKeypair);
// --- Client-Seite ---
$clientKeypair = sodium_crypto_kx_keypair();
$clientPublicKey = sodium_crypto_kx_publickey($clientKeypair);
// Client leitet Sitzungsschlüssel ab (mit dem öffentlichen Schlüssel des Servers)
[$clientRx, $clientTx] = sodium_crypto_kx_client_session_keys($clientKeypair, $serverPublicKey);
// Server leitet Sitzungsschlüssel ab (mit dem öffentlichen Schlüssel des Clients)
[$serverRx, $serverTx] = sodium_crypto_kx_server_session_keys($serverKeypair, $clientPublicKey);
// Prüfen: Client-TX muss Server-RX entsprechen (und umgekehrt)
if (sodium_memcmp($clientTx, $serverRx) === 0) {
echo 'Schlüsselaustausch erfolgreich – Sitzungsschlüssel stimmen überein.' . PHP_EOL;
} else {
echo 'Fehler: Sitzungsschlüssel stimmen NICHT überein!' . PHP_EOL;
}
// Speicher bereinigen
sodium_memzero($serverKeypair);
sodium_memzero($clientKeypair);
sodium_memzero($clientRx);
sodium_memzero($clientTx);
sodium_memzero($serverRx);
sodium_memzero($serverTx);
// Wichtig · Fallstricke
Binärdaten: Der zurückgegebene Schlüssel enthält Binärdaten und sollte nicht direkt in einem Text-Kontext verwendet werden. Für die Übertragung oder Speicherung empfehlen sich sodium_bin2hex() oder sodium_bin2base64().
Schlüsselpaare schützen: Das vollständige Schlüsselpaar ($keypair) enthält auch den geheimen Schlüssel und muss vertraulich behandelt werden. Nach der Verwendung sollte es mit sodium_memzero() aus dem Speicher gelöscht werden.
Keine manuelle Extraktion: Der öffentliche Schlüssel befindet sich in den ersten 32 Bytes des Schlüsselpaars, aber es ist ausdrücklich empfohlen, diese Funktion statt einer manuellen substr()-Extraktion zu verwenden, um zukunftssicher und korrekt zu bleiben.