Signatur
Beschreibung
sodium_crypto_box_keypair() generiert kryptographisch sichere, zufällige Schlüsselpaare für die authentifizierte, asymmetrische Verschlüsselung nach dem Curve25519/XSalsa20/Poly1305-Verfahren (NaCl crypto_box). Die Funktion gibt einen kombinierten Binär-String zurück, der sowohl den privaten als auch den öffentlichen Schlüssel enthält.
Der zurückgegebene String kann mit sodium_crypto_box_secretkey() und sodium_crypto_box_publickey() in die jeweiligen Einzelbestandteile aufgespalten werden. Der öffentliche Schlüssel wird an die Gegenseite übermittelt, während der private Schlüssel sicher gespeichert und niemals weitergegeben werden darf.
Das erzeugte Schlüsselpaar wird typischerweise einmalig erzeugt, sicher persistiert (z. B. in einer Datei oder einem Secret-Store) und für spätere Verschlüsselungs- und Entschlüsselungsoperationen wiederverwendet. Für kurzlebige Sitzungsschlüssel kann das Paar auch dynamisch erzeugt werden.
Die Funktion ist Teil der libsodium-Erweiterung, die seit PHP 7.2 fest in den PHP-Core integriert ist und als state-of-the-art-Krypto-Bibliothek gilt.
Rückgabewert
SODIUM_CRYPTO_BOX_KEYPAIRBYTES (64 Bytes), der das kombinierte Schlüsselpaar enthält. Mit sodium_crypto_box_secretkey() und sodium_crypto_box_publickey() können die Einzelschlüssel extrahiert werden.Beispiele
Schlüsselpaar erzeugen und Einzelschlüssel extrahieren
<?php
// Schlüsselpaar generieren
$keypair = sodium_crypto_box_keypair();
// Einzelschlüssel extrahieren
$secretKey = sodium_crypto_box_secretkey($keypair);
$publicKey = sodium_crypto_box_publickey($keypair);
echo 'Keypair-Länge: ' . strlen($keypair) . ' Bytes\n';
echo 'SecretKey-Länge: ' . strlen($secretKey) . ' Bytes\n';
echo 'PublicKey-Länge: ' . strlen($publicKey) . ' Bytes\n';
// Schlüssel Base64-kodiert zur sicheren Speicherung ausgeben
echo 'PublicKey (Base64): ' . base64_encode($publicKey) . "\n";
Vollständiges Verschlüsselungs- und Entschlüsselungsbeispiel
<?php
// Schlüsselpaare für Sender und Empfänger erzeugen
$aliceKeypair = sodium_crypto_box_keypair();
$aliceSecret = sodium_crypto_box_secretkey($aliceKeypair);
$alicePublic = sodium_crypto_box_publickey($aliceKeypair);
$bobKeypair = sodium_crypto_box_keypair();
$bobSecret = sodium_crypto_box_secretkey($bobKeypair);
$bobPublic = sodium_crypto_box_publickey($bobKeypair);
$message = 'Geheime Nachricht von Alice an Bob';
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
// Alice verschlüsselt mit ihrem privaten Schlüssel und Bobs öffentlichem Schlüssel
$aliceToBobKeypair = sodium_crypto_box_keypair_from_secretkey_and_publickey($aliceSecret, $bobPublic);
$ciphertext = sodium_crypto_box($message, $nonce, $aliceToBobKeypair);
// Bob entschlüsselt mit seinem privaten Schlüssel und Alices öffentlichem Schlüssel
$bobToAliceKeypair = sodium_crypto_box_keypair_from_secretkey_and_publickey($bobSecret, $alicePublic);
$decrypted = sodium_crypto_box_open($ciphertext, $nonce, $bobToAliceKeypair);
echo $decrypted . "\n";
// Speicher mit sensiblen Daten löschen
sodium_memzero($aliceSecret);
sodium_memzero($bobSecret);
// Wichtig · Fallstricke
Sicherheitshinweise:
- Der private Schlüssel (
secretkey) darf niemals übertragen oder protokolliert werden. Er sollte ausschließlich verschlüsselt gespeichert werden, z. B. mitsodium_crypto_secretbox()oder einem Hardware-Sicherheitsmodul. - Nach der Verwendung des privaten Schlüssels im Arbeitsspeicher empfiehlt sich der Aufruf von
sodium_memzero(), um den Speicher zu bereinigen. - Jede Verschlüsselungsoperation erfordert eine einzigartige Nonce. Verwende
random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES), um eine sichere, zufällige Nonce zu erzeugen. Eine Nonce darf mit demselben Schlüsselpaar niemals wiederverwendet werden. - Für kurzlebige Schlüsselpaare (z. B. Diffie-Hellman-Handshake) kann
sodium_crypto_kx_keypair()die besser geeignete Wahl sein.