Start · Sprachen · PHP · Referenz · sodium_crypto_box_keypair

sodium_crypto_box_keypair

Funktion

Erzeugt ein zufälliges Schlüsselpaar (öffentlicher + privater Schlüssel) für die asymmetrische <code>crypto_box</code>-Verschlüsselung.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_box_keypair(): string

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

Typ
string
Beschreibung
Ein Binär-String der Länge 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";
Keypair-Länge: 64 Bytes SecretKey-Länge: 32 Bytes PublicKey-Länge: 32 Bytes PublicKey (Base64): <zufälliger Base64-String>

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);
Geheime Nachricht von Alice an Bob

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Der private Schlüssel (secretkey) darf niemals übertragen oder protokolliert werden. Er sollte ausschließlich verschlüsselt gespeichert werden, z. B. mit sodium_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.