Start · Sprachen · PHP · Referenz · sodium_crypto_kx_publickey

sodium_crypto_kx_publickey

Funktion

Extrahiert den öffentlichen Schlüssel aus einem <code>crypto_kx</code>-Schlüsselpaar.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_kx_publickey(string $keypair): string

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

Typ
string
Beschreibung
Gibt den öffentlichen Schlüssel als binären String der Länge 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;
Länge des öffentlichen Schlüssels: 32 Bytes SODIUM_CRYPTO_KX_PUBLICKEYBYTES: 32 Öffentlicher Schlüssel (Hex): <64 zufällige Hex-Zeichen>

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);
Schlüsselaustausch erfolgreich – Sitzungsschlüssel stimmen überein.

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