Signatur
Beschreibung
Diese Funktion kombiniert einen geheimen Schlüssel (Secret Key) und einen öffentlichen Schlüssel (Public Key) zu einem einzigen Schlüsselpaar-String, wie er von den sodium_crypto_box_*-Funktionen erwartet wird. Dies ist insbesondere dann nützlich, wenn Sender und Empfänger ihre Schlüssel separat gespeichert haben und für eine verschlüsselte Kommunikation ein gemeinsames Keypair-Handle benötigen.
Der typische Anwendungsfall ist die asymmetrische, authentifizierte Verschlüsselung (Box-Kryptografie nach Curve25519/XSalsa20/Poly1305): Der Sender nutzt seinen eigenen geheimen Schlüssel und den öffentlichen Schlüssel des Empfängers, um eine Nachricht zu verschlüsseln. Der Empfänger verwendet dann seinen eigenen geheimen Schlüssel und den öffentlichen Schlüssel des Senders zum Entschlüsseln.
Der zurückgegebene Keypair-String hat eine feste Länge von SODIUM_CRYPTO_BOX_KEYPAIRBYTES Bytes und kann direkt an sodium_crypto_box(), sodium_crypto_box_open() sowie verwandte Funktionen übergeben werden. Die Schlüssel müssen exakt die korrekte Länge aufweisen (SODIUM_CRYPTO_BOX_SECRETKEYBYTES bzw. SODIUM_CRYPTO_BOX_PUBLICKEYBYTES), andernfalls wird eine SodiumException geworfen.
Diese Funktion führt selbst keine kryptografischen Berechnungen durch – sie verkettet die beiden Schlüssel lediglich in das Format, das die libsodium-API intern erwartet. Der eigentliche gemeinsame Geheimschlüssel (Diffie-Hellman) wird erst bei sodium_crypto_box() berechnet.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $secret_key Pflicht | string | Der eigene geheime Schlüssel (Secret Key) mit einer Länge von genau SODIUM_CRYPTO_BOX_SECRETKEYBYTES (32 Bytes). Typischerweise mit sodium_crypto_box_keypair() oder sodium_crypto_box_secretkey() erzeugt. |
|
| $public_key Pflicht | string | Der öffentliche Schlüssel der Gegenstelle (Public Key) mit einer Länge von genau SODIUM_CRYPTO_BOX_PUBLICKEYBYTES (32 Bytes). Typischerweise vom Kommunikationspartner empfangen und mit sodium_crypto_box_publickey() extrahiert. |
Rückgabewert
SODIUM_CRYPTO_BOX_KEYPAIRBYTES (64 Bytes) zurück, der den geheimen und den öffentlichen Schlüssel kombiniert. Dieser kann direkt an sodium_crypto_box() und verwandte Funktionen übergeben werden. Bei ungültiger Schlüssellänge wird eine SodiumException geworfen.Beispiele
Nachricht zwischen zwei Parteien verschlüsseln
<?php
// Schlüsselpaare für Alice und Bob generieren
$aliceKeypair = sodium_crypto_box_keypair();
$aliceSecretKey = sodium_crypto_box_secretkey($aliceKeypair);
$alicePublicKey = sodium_crypto_box_publickey($aliceKeypair);
$bobKeypair = sodium_crypto_box_keypair();
$bobSecretKey = sodium_crypto_box_secretkey($bobKeypair);
$bobPublicKey = sodium_crypto_box_publickey($bobKeypair);
// Alice verschlüsselt: eigener Secret Key + Bobs Public Key
$aliceToBobKeypair = sodium_crypto_box_keypair_from_secretkey_and_publickey(
$aliceSecretKey,
$bobPublicKey
);
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
$plaintext = 'Geheime Nachricht von Alice an Bob';
$ciphertext = sodium_crypto_box($plaintext, $nonce, $aliceToBobKeypair);
echo 'Verschlüsselt: ' . base64_encode($ciphertext) . PHP_EOL;
// Bob entschlüsselt: eigener Secret Key + Alices Public Key
$bobFromAliceKeypair = sodium_crypto_box_keypair_from_secretkey_and_publickey(
$bobSecretKey,
$alicePublicKey
);
$decrypted = sodium_crypto_box_open($ciphertext, $nonce, $bobFromAliceKeypair);
echo 'Entschlüsselt: ' . $decrypted . PHP_EOL;
// Speicher bereinigen
sodium_memzero($aliceSecretKey);
sodium_memzero($bobSecretKey);
Schlüssel aus dem Speicher laden und Keypair rekonstruieren
<?php
// Simuliert gespeicherte Schlüssel (z.B. aus Datenbank oder Datei)
$storedSecretKeyHex = '...'; // 64 Hex-Zeichen = 32 Bytes
$partnerPublicKeyHex = '...'; // 64 Hex-Zeichen = 32 Bytes
// Beispielschlüssel erzeugen für Demo
$myKeypair = sodium_crypto_box_keypair();
$mySecretKey = sodium_crypto_box_secretkey($myKeypair);
$partnerKeypair = sodium_crypto_box_keypair();
$partnerPublicKey = sodium_crypto_box_publickey($partnerKeypair);
// Keypair aus einzelnen Schlüsseln rekonstruieren
$communicationKeypair = sodium_crypto_box_keypair_from_secretkey_and_publickey(
$mySecretKey,
$partnerPublicKey
);
echo 'Keypair-Länge: ' . strlen($communicationKeypair) . ' Bytes' . PHP_EOL;
echo 'Erwartete Länge: ' . SODIUM_CRYPTO_BOX_KEYPAIRBYTES . ' Bytes' . PHP_EOL;
sodium_memzero($mySecretKey);
// Wichtig · Fallstricke
Sicherheitshinweise:
- Der geheime Schlüssel (
$secret_key) sollte niemals im Klartext gespeichert oder übertragen werden. Verwendesodium_memzero(), um ihn nach der Verwendung aus dem Speicher zu löschen. - Es ist entscheidend, den richtigen eigenen Secret Key mit dem Public Key der Gegenstelle zu kombinieren – nicht den eigenen Public Key. Eine Verwechslung führt zu Entschlüsselungsfehlern oder Sicherheitslücken.
- Der Nonce (
random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES)) muss für jede Nachricht einmalig und zufällig sein und muss dem Empfänger sicher übermittelt werden (darf aber öffentlich sein). - Übergib niemals Schlüssel falscher Länge – die Funktion wirft in diesem Fall eine
SodiumException. - Diese Funktion steht erst ab PHP 7.2 nativ zur Verfügung. Für ältere PHP-Versionen ist die PECL-Erweiterung
libsodiumerforderlich.