Start · Sprachen · PHP · Referenz · sodium_crypto_stream_xchacha20_keygen

sodium_crypto_stream_xchacha20_keygen

Funktion

Erzeugt einen kryptografisch sicheren Zufallsschlüssel für die Verwendung mit <code>sodium_crypto_stream_xchacha20</code>.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_stream_xchacha20_keygen(): string

Beschreibung

sodium_crypto_stream_xchacha20_keygen() generiert einen zufälligen, kryptografisch sicheren Schlüssel der Länge SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES (32 Bytes). Dieser Schlüssel ist für den Einsatz mit dem XChaCha20-Stromchiffre-Algorithmus vorgesehen und sollte ausschließlich mit den zugehörigen XChaCha20-Funktionen verwendet werden.

Die Funktion nutzt intern den systemweiten CSPRNG (Cryptographically Secure Pseudo-Random Number Generator), sodass der zurückgegebene Schlüssel für kryptografische Zwecke geeignet ist. Ein manuelles Erzeugen von Schlüsseln über random_bytes() ist zwar prinzipiell möglich, die dedizierte Keygen-Funktion ist jedoch der empfohlene Weg, da sie den korrekten Schlüssel automatisch auf die richtige Länge abstimmt.

XChaCha20 ist eine Variante des ChaCha20-Algorithmus mit einem erweiterten 192-Bit-Nonce, was die Gefahr von Nonce-Wiederholungen bei zufällig gewählten Nonces erheblich reduziert. Die Kombination aus einem sicheren Schlüssel und einem einmaligen Nonce ist entscheidend für die Sicherheit des Verfahrens.

Der generierte Schlüssel sollte sicher gespeichert und niemals im Klartext übertragen werden. Eine Ausgabe oder Protokollierung des Schlüssels ist zu vermeiden.

Rückgabewert

Typ
string
Beschreibung
Gibt einen 32 Byte langen (SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES) kryptografisch sicheren Zufallsschlüssel als binären String zurück.

Beispiele

Schlüssel erzeugen und für XChaCha20 verwenden

<?php
// Schlüssel und Nonce erzeugen
$key   = sodium_crypto_stream_xchacha20_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES);

// Schlüsselstrom generieren (z. B. 64 Bytes)
$keystream = sodium_crypto_stream_xchacha20(64, $nonce, $key);

echo 'Schlüssellänge: ' . strlen($key) . ' Bytes' . PHP_EOL;
echo 'Nonce-Länge:    ' . strlen($nonce) . ' Bytes' . PHP_EOL;
echo 'Keystream (hex): ' . bin2hex($keystream) . PHP_EOL;

// Speicher sensiblen Inhalts sicher löschen
sodium_memzero($key);
Schlüssellänge: 32 Bytes Nonce-Länge: 24 Bytes Keystream (hex): <64-Byte-Hex-Wert>

Datenverschlüsselung mittels XOR mit XChaCha20-Keystream

<?php
$plaintext = 'Geheime Nachricht';

// Schlüssel und Nonce erzeugen
$key   = sodium_crypto_stream_xchacha20_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES);

// Verschlüsseln: XOR des Klartexts mit dem Keystream
$ciphertext = sodium_crypto_stream_xchacha20_xor($plaintext, $nonce, $key);

// Entschlüsseln: erneutes XOR ist selbstinvers
$decrypted = sodium_crypto_stream_xchacha20_xor($ciphertext, $nonce, $key);

echo 'Original:      ' . $plaintext . PHP_EOL;
echo 'Entschlüsselt: ' . $decrypted . PHP_EOL;

sodium_memzero($key);
Original: Geheime Nachricht Entschlüsselt: Geheime Nachricht

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Ein Nonce darf für denselben Schlüssel niemals wiederverwendet werden — auch nicht zufällig. XChaCha20 verringert dieses Risiko durch seinen langen 192-Bit-Nonce, der zufällig gewählt werden darf.
  • Der Schlüssel enthält sensible Rohdaten. Verwende sodium_memzero(), um den Schlüssel nach Gebrauch sicher aus dem Speicher zu entfernen.
  • XChaCha20 bietet keine Authentifizierung. Für authentifizierte Verschlüsselung sollte stattdessen sodium_crypto_aead_xchacha20poly1305_ietf_encrypt() verwendet werden.
  • Der Schlüssel sollte niemals in Logdateien, Fehlermeldungen oder HTTP-Antworten erscheinen.