Start · Sprachen · PHP · Referenz · sodium_crypto_kx_seed_keypair

sodium_crypto_kx_seed_keypair

Funktion

Leitet ein deterministisches <code>crypto_kx</code>-Schlüsselpaar (öffentlicher + geheimer Schlüssel) aus einem gegebenen Seed ab.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_kx_seed_keypair(string $seed): string

Beschreibung

sodium_crypto_kx_seed_keypair() erzeugt ein Schlüsselpaar für den Libsodium-Schlüsselaustausch (crypto_kx) auf deterministische Weise: Aus demselben Seed wird immer exakt dasselbe Schlüsselpaar reproduziert. Dies ist nützlich, wenn Schlüssel aus einem Master-Secret oder einem anderen deterministischen Verfahren (z. B. einem KDF-Output) abgeleitet werden sollen, ohne sie separat speichern zu müssen.

Das zurückgegebene Byte-Paar enthält sowohl den geheimen als auch den öffentlichen Schlüssel in einem einzigen String. Mit sodium_crypto_kx_secretkey() und sodium_crypto_kx_publickey() können die beiden Teile extrahiert werden. Das Schlüsselpaar eignet sich anschließend für sodium_crypto_kx_client_session_keys() und sodium_crypto_kx_server_session_keys(), um sitzungsgebundene Verschlüsselungsschlüssel auszuhandeln.

Im Gegensatz zu sodium_crypto_kx_keypair(), das einen zufälligen Schlüssel generiert, liefert diese Funktion bei gleichem Seed stets das gleiche Ergebnis – die Sicherheit hängt daher vollständig von der Geheimhaltung und Qualität (Entropie) des Seeds ab. Der Seed muss exakt SODIUM_CRYPTO_KX_SEEDBYTES Bytes lang sein.

Parameter

Name Typ Default Beschreibung
$seed Pflicht string Ein Byte-String mit exakt SODIUM_CRYPTO_KX_SEEDBYTES (32) Bytes hoher Entropie, aus dem das Schlüsselpaar deterministisch abgeleitet wird. Muss geheim gehalten werden.

Rückgabewert

Typ
string
Beschreibung
Ein Byte-String, der sowohl den geheimen als auch den öffentlichen Schlüssel enthält. Die Gesamtlänge beträgt SODIUM_CRYPTO_KX_SECRETKEYBYTES + SODIUM_CRYPTO_KX_PUBLICKEYBYTES Bytes. Mit sodium_crypto_kx_secretkey() bzw. sodium_crypto_kx_publickey() lassen sich die Einzelteile extrahieren.

Beispiele

Schlüsselpaar aus festem Seed ableiten und Teile extrahieren

<?php
// Seed mit exakt SODIUM_CRYPTO_KX_SEEDBYTES Bytes
$seed = random_bytes(SODIUM_CRYPTO_KX_SEEDBYTES);

// Deterministisches Schlüsselpaar aus dem Seed erzeugen
$keypair = sodium_crypto_kx_seed_keypair($seed);

// Öffentlichen und geheimen Schlüssel extrahieren
$secretKey = sodium_crypto_kx_secretkey($keypair);
$publicKey  = sodium_crypto_kx_publickey($keypair);

echo 'Seed-Länge:       ' . strlen($seed)      . ' Bytes' . PHP_EOL;
echo 'SecretKey-Länge:  ' . strlen($secretKey) . ' Bytes' . PHP_EOL;
echo 'PublicKey-Länge:  ' . strlen($publicKey)  . ' Bytes' . PHP_EOL;
echo 'PublicKey (hex):  ' . sodium_bin2hex($publicKey) . PHP_EOL;
Seed-Länge: 32 Bytes SecretKey-Länge: 64 Bytes PublicKey-Länge: 32 Bytes PublicKey (hex): <hexadezimaler Wert>

Reproduzierbares Schlüsselpaar für Client-Server-Schlüsselaustausch

<?php
// Fixer Seed (z. B. aus sicherem Passwortspeicher oder KDF)
$seed = sodium_hex2bin('4a656672657973206b65792073656564206578616d706c652e2e2e2e2e2e2e2e');

// Schlüsselpaare für Client und Server aus demselben Seed ableiten
// (in der Praxis würden Client und Server unterschiedliche Seeds nutzen)
$clientKeypair = sodium_crypto_kx_seed_keypair($seed);
$serverKeypair = sodium_crypto_kx_keypair(); // zufällig für den Server

$serverPublicKey = sodium_crypto_kx_publickey($serverKeypair);
$clientPublicKey = sodium_crypto_kx_publickey($clientKeypair);

// Sitzungsschlüssel aushandeln
[$rxClient, $txClient] = sodium_crypto_kx_client_session_keys($clientKeypair, $serverPublicKey);
[$rxServer, $txServer] = sodium_crypto_kx_server_session_keys($serverKeypair, $clientPublicKey);

// Client-TX muss Server-RX entsprechen und umgekehrt
echo 'Schlüssel stimmen überein: ';
echo ($txClient === $rxServer && $rxClient === $txServer) ? 'Ja' : 'Nein';
echo PHP_EOL;
Schlüssel stimmen überein: Ja

// Wichtig · Fallstricke

Sicherheit des Seeds: Da das Schlüsselpaar vollständig deterministisch aus dem Seed abgeleitet wird, ist die Sicherheit des gesamten Systems direkt an die Geheimhaltung und Entropie des Seeds geknüpft. Ein vorhersehbarer oder kompromittierter Seed macht alle daraus erzeugten Schlüssel unsicher.

Seed-Länge: Der Seed muss exakt SODIUM_CRYPTO_KX_SEEDBYTES (32) Bytes lang sein – andernfalls wird eine SodiumException geworfen.

Kein Zufalls-Schlüssel: Wird kein deterministisches Verhalten benötigt, sollte stattdessen sodium_crypto_kx_keypair() verwendet werden, das intern einen kryptografisch sicheren Zufallsgenerator nutzt.

Speicher bereinigen: Geheime Schlüssel und Seeds sollten nach der Verwendung mit sodium_memzero() aus dem Speicher gelöscht werden, um Leaks zu minimieren.