Start · Sprachen · PHP · Referenz · sodium_crypto_box_publickey_from_secretkey

sodium_crypto_box_publickey_from_secretkey

Funktion

Leitet den öffentlichen Schlüssel aus einem gegebenen geheimen Schlüssel für die asymmetrische Box-Verschlüsselung ab.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_box_publickey_from_secretkey(string $secret_key): string

Beschreibung

Die Funktion sodium_crypto_box_publickey_from_secretkey() berechnet deterministisch den zugehörigen öffentlichen Schlüssel aus einem bereits vorhandenen geheimen Schlüssel. Sie ist Teil der libsodium-Bindings in PHP und basiert auf dem Curve25519-Diffie-Hellman-Algorithmus, der auch von sodium_crypto_box() verwendet wird.

Diese Funktion ist besonders nützlich, wenn ein geheimer Schlüssel bereits gespeichert ist und der zugehörige öffentliche Schlüssel erneut abgeleitet werden muss – beispielsweise nach dem Laden des privaten Schlüssels aus einer Datenbank oder Datei – ohne das vollständige Schlüsselpaar neu zu generieren.

Der Eingabe-Schlüssel muss genau SODIUM_CRYPTO_BOX_SECRETKEYBYTES (32 Byte) lang sein. Typischerweise erhält man diesen geheimen Schlüssel entweder direkt aus sodium_crypto_box_keypair() über sodium_crypto_box_secretkey() oder durch eigene sichere Schlüsselverwaltung.

Das Ergebnis ist ein roher Binär-String mit einer Länge von SODIUM_CRYPTO_BOX_PUBLICKEYBYTES (32 Byte), der an Kommunikationspartner weitergegeben werden kann, ohne die Sicherheit des Systems zu gefährden.

Parameter

Name Typ Default Beschreibung
$secret_key Pflicht string Der geheime Schlüssel als Binär-String mit einer Länge von genau SODIUM_CRYPTO_BOX_SECRETKEYBYTES (32 Byte). Dieser Schlüssel darf niemals öffentlich weitergegeben werden.

Rückgabewert

Typ
string
Beschreibung
Gibt den abgeleiteten öffentlichen Schlüssel als rohen Binär-String mit einer Länge von SODIUM_CRYPTO_BOX_PUBLICKEYBYTES (32 Byte) zurück. Eine Ausnahme wird geworfen, wenn der Eingabe-Schlüssel ungültig ist.

Beispiele

Öffentlichen Schlüssel aus gespeichertem geheimen Schlüssel ableiten

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

// Geheimen Schlüssel sicher speichern (hier: vereinfachte Darstellung)
file_put_contents('/secure/path/secret.key', $secretKey);

// Später: geheimen Schlüssel laden und öffentlichen Schlüssel ableiten
$loadedSecretKey = file_get_contents('/secure/path/secret.key');
$publicKey = sodium_crypto_box_publickey_from_secretkey($loadedSecretKey);

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

// Zur Überprüfung: originaler öffentlicher Schlüssel aus Keypair
$originalPublicKey = sodium_crypto_box_publickey($keypair);
echo 'Identisch: ' . ($publicKey === $originalPublicKey ? 'Ja' : 'Nein') . PHP_EOL;
Öffentlicher Schlüssel (hex): <32-Byte-Hex-String> Länge: 32 Byte Identisch: Ja

Öffentlichen Schlüssel für den Austausch mit einem Kommunikationspartner bereitstellen

<?php
// Eigenes Schlüsselpaar laden (geheimer Schlüssel aus sicherem Speicher)
$mySecretKey = sodium_hex2bin(getenv('MY_SECRET_KEY_HEX'));

// Öffentlichen Schlüssel deterministisch ableiten
$myPublicKey = sodium_crypto_box_publickey_from_secretkey($mySecretKey);

// Öffentlichen Schlüssel base64-kodiert an Partner übertragen
$publicKeyForPartner = base64_encode($myPublicKey);
echo 'Mein öffentlicher Schlüssel (base64): ' . $publicKeyForPartner . PHP_EOL;

// Öffentlichen Schlüssel des Partners empfangen
$partnerPublicKey = base64_decode($_POST['partner_public_key'] ?? '');

if (strlen($partnerPublicKey) === SODIUM_CRYPTO_BOX_PUBLICKEYBYTES) {
    // Gemeinsames Keypair für die Kommunikation aufbauen
    $communicationKeypair = sodium_crypto_box_keypair_from_secretkey_and_publickey(
        $mySecretKey,
        $partnerPublicKey
    );
    echo 'Kommunikations-Keypair erfolgreich erstellt.' . PHP_EOL;
} else {
    echo 'Ungültiger öffentlicher Schlüssel des Partners.' . PHP_EOL;
}
Mein öffentlicher Schlüssel (base64): <Base64-String> Kommunikations-Keypair erfolgreich erstellt.

// Wichtig · Fallstricke

Sicherheitshinweis: Der geheime Schlüssel ($secret_key) darf niemals im Klartext gespeichert, geloggt oder über unsichere Kanäle übertragen werden. Verwende sichere Speichermethoden (z. B. Hardware-Sicherheitsmodule, verschlüsselte Dateisysteme oder Umgebungsvariablen mit eingeschränktem Zugriff).

Nach der Verwendung des geheimen Schlüssels empfiehlt sich der Einsatz von sodium_memzero(), um den Schlüssel sicher aus dem Arbeitsspeicher zu löschen und Seitenkanal-Angriffe zu erschweren.

Die Funktion wirft eine SodiumException, wenn der übergebene Schlüssel nicht die erwartete Länge von SODIUM_CRYPTO_BOX_SECRETKEYBYTES (32 Byte) hat. Überprüfe die Schlüssellänge daher vor dem Aufruf.