Start · Sprachen · PHP · Referenz · sodium_crypto_box_publickey

sodium_crypto_box_publickey

Funktion

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

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_box_publickey(string $key_pair): string

Beschreibung

sodium_crypto_box_publickey() entnimmt einem vollständigen Schlüsselpaar, wie es z. B. von sodium_crypto_box_keypair() oder sodium_crypto_box_keypair_from_secretkey_and_publickey() erzeugt wurde, den öffentlichen Anteil und gibt ihn als Binär-String zurück.

Das Schlüsselpaar ist intern ein binärer Blob, der sowohl den privaten als auch den öffentlichen Schlüssel enthält. Diese Funktion ermöglicht es, den öffentlichen Schlüssel isoliert zu extrahieren, um ihn beispielsweise an einen Kommunikationspartner weiterzugeben, ohne den privaten Schlüssel preiszugeben.

Der zurückgegebene öffentliche Schlüssel hat eine feste Länge von SODIUM_CRYPTO_BOX_PUBLICKEYBYTES Bytes (32 Bytes bei Curve25519). Er kann anschließend z. B. für sodium_crypto_box() oder sodium_crypto_box_open() verwendet werden, wenn man mit dem öffentlichen Schlüssel des Empfängers verschlüsseln möchte.

Typischer Einsatzfall ist die Weitergabe des öffentlichen Schlüssels an andere Teilnehmer eines verschlüsselten Nachrichtenaustauschs, während der private Schlüssel sicher gespeichert bleibt.

Parameter

Name Typ Default Beschreibung
$key_pair Pflicht string Das vollständige Schlüsselpaar als Binär-String, wie es von sodium_crypto_box_keypair() oder sodium_crypto_box_keypair_from_secretkey_and_publickey() erzeugt wurde. Die erwartete Länge beträgt SODIUM_CRYPTO_BOX_KEYPAIRBYTES Bytes.

Rückgabewert

Typ
string
Beschreibung
Den öffentlichen Schlüssel als Binär-String mit einer Länge von SODIUM_CRYPTO_BOX_PUBLICKEYBYTES (32) Bytes. Bei einem ungültigen Eingabe-Schlüsselpaar wird eine SodiumException geworfen.

Beispiele

Öffentlichen Schlüssel aus einem neuen Schlüsselpaar extrahieren

<?php
// Neues Schlüsselpaar erzeugen
$keyPair = sodium_crypto_box_keypair();

// Öffentlichen Schlüssel extrahieren
$publicKey = sodium_crypto_box_publickey($keyPair);

// Privaten Schlüssel extrahieren
$secretKey = sodium_crypto_box_secretkey($keyPair);

echo 'Länge des öffentlichen Schlüssels: ' . strlen($publicKey) . ' Bytes' . PHP_EOL;
echo 'Erwartete Länge: ' . SODIUM_CRYPTO_BOX_PUBLICKEYBYTES . ' Bytes' . PHP_EOL;

// Öffentlichen Schlüssel Base64-kodiert ausgeben (z. B. zur Weitergabe)
echo 'Öffentlicher Schlüssel (Base64): ' . base64_encode($publicKey) . PHP_EOL;

// Speicher bereinigen
sodium_memzero($secretKey);
sodium_memzero($keyPair);
Länge des öffentlichen Schlüssels: 32 Bytes Erwartete Länge: 32 Bytes Öffentlicher Schlüssel (Base64): <Base64-kodierter Schlüssel>

Asymmetrische Verschlüsselung zwischen zwei Teilnehmern

<?php
// Alice erzeugt ihr Schlüsselpaar
$aliceKeyPair = sodium_crypto_box_keypair();
$alicePublicKey = sodium_crypto_box_publickey($aliceKeyPair);
$aliceSecretKey = sodium_crypto_box_secretkey($aliceKeyPair);

// Bob erzeugt sein Schlüsselpaar
$bobKeyPair = sodium_crypto_box_keypair();
$bobPublicKey = sodium_crypto_box_publickey($bobKeyPair);
$bobSecretKey = sodium_crypto_box_secretkey($bobKeyPair);

// Alice verschlüsselt eine Nachricht für Bob
// Schlüsselpaar aus Alices privatem + Bobs öffentlichem Schlüssel
$aliceToBobKeyPair = sodium_crypto_box_keypair_from_secretkey_and_publickey(
    $aliceSecretKey,
    $bobPublicKey
);

$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
$message = 'Hallo Bob, dies ist eine geheime Nachricht!';
$ciphertext = sodium_crypto_box($message, $nonce, $aliceToBobKeyPair);

// Bob entschlüsselt mit seinem privaten + Alices öffentlichem Schlüssel
$bobToAliceKeyPair = sodium_crypto_box_keypair_from_secretkey_and_publickey(
    $bobSecretKey,
    $alicePublicKey
);

$decrypted = sodium_crypto_box_open($ciphertext, $nonce, $bobToAliceKeyPair);

echo 'Entschlüsselte Nachricht: ' . $decrypted . PHP_EOL;

// Speicher bereinigen
sodium_memzero($aliceSecretKey);
sodium_memzero($bobSecretKey);
sodium_memzero($aliceKeyPair);
sodium_memzero($bobKeyPair);
Entschlüsselte Nachricht: Hallo Bob, dies ist eine geheime Nachricht!

// Wichtig · Fallstricke

Sicherheitshinweis: Speichern Sie das vollständige Schlüsselpaar (und insbesondere den privaten Schlüssel) niemals im Klartext in einer Datenbank oder Konfigurationsdatei. Verwenden Sie stattdessen sichere Speicherorte und bereinigen Sie Schlüsselmaterial nach der Verwendung mit sodium_memzero().

Der öffentliche Schlüssel kann gefahrlos weitergegeben werden, da aus ihm nicht der private Schlüssel berechnet werden kann (Einwegfunktion auf Basis von Curve25519).

Wird ein Binär-String übergeben, der nicht die erwartete Länge SODIUM_CRYPTO_BOX_KEYPAIRBYTES hat, wirft die Funktion eine SodiumException. Fangen Sie diese mit einem try/catch-Block ab.