Signatur
Beschreibung
sodium_crypto_stream_xchacha20 erzeugt einen deterministischen Strom pseudozufälliger Bytes mit dem XChaCha20-Streamcipher. Dabei werden ein 32-Byte-Schlüssel und eine 24-Byte-Nonce zu einem Byteblock der gewünschten Länge expandiert. Der Strom ist vollständig durch Schlüssel und Nonce bestimmt: Gleiche Eingaben liefern stets dieselbe Ausgabe.
Die Funktion ist vor allem nützlich, um einen deterministischen Pseudozufallsstrom zu erzeugen, der z. B. per XOR mit Klartextdaten zur symmetrischen Verschlüsselung verwendet werden kann. Für vollständige Authentifizierte Verschlüsselung sollte hingegen sodium_crypto_aead_xchacha20poly1305_ietf_encrypt bevorzugt werden, da jene zusätzlich Integrität und Authentizität sicherstellt.
Der XChaCha20-Algorithmus erlaubt dank der erweiterten 192-Bit-Nonce eine zufällige Nonce-Wahl ohne Kollisionsgefahr, was bei häufig wechselnden Nachrichten praktisch ist. Die Funktion ist Teil der libsodium-Bindings und steht ab PHP 7.2 nativ zur Verfügung.
Wichtig: Ein reiner Pseudozufallsstrom ohne Authentifizierung bietet keinen Schutz gegen Manipulation. Wird diese Funktion zur Verschlüsselung eingesetzt (XOR mit Klartext), muss die Integrität der Daten separat abgesichert werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $length Pflicht | int | Anzahl der zu erzeugenden pseudozufälligen Bytes. Muss größer als 0 sein und darf PHP_INT_MAX nicht überschreiten. |
|
| $nonce Pflicht | string | Eine 24 Byte lange Nonce (SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES). Sie muss für jede Nachricht/Sitzung einzigartig sein; bei zufälliger Wahl kann random_bytes(SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES) verwendet werden. |
|
| $key Pflicht | string | Ein 32 Byte langer geheimer Schlüssel (SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES). Sollte mit sodium_crypto_stream_xchacha20_keygen() erzeugt werden. |
Rückgabewert
SodiumException geworfen.Beispiele
Pseudozufälligen Bytestrom erzeugen
<?php
// Schlüssel und Nonce erzeugen
$key = sodium_crypto_stream_xchacha20_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES);
// 64 pseudozufällige Bytes generieren
$stream = sodium_crypto_stream_xchacha20(64, $nonce, $key);
echo 'Länge des Stroms: ' . strlen($stream) . ' Bytes' . PHP_EOL;
echo 'Hex: ' . bin2hex($stream) . PHP_EOL;
Einfache XOR-Verschlüsselung (ohne Authentifizierung)
<?php
$key = sodium_crypto_stream_xchacha20_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES);
$plaintext = 'Geheime Nachricht!';
// Verschlüsseln: Klartext XOR Pseudozufallsstrom
$stream = sodium_crypto_stream_xchacha20(strlen($plaintext), $nonce, $key);
$ciphertext = $plaintext ^ $stream;
echo 'Ciphertext (hex): ' . bin2hex($ciphertext) . PHP_EOL;
// Entschlüsseln: Ciphertext XOR denselben Strom (deterministisch)
$stream2 = sodium_crypto_stream_xchacha20(strlen($ciphertext), $nonce, $key);
$decrypted = $ciphertext ^ $stream2;
echo 'Entschlüsselt: ' . $decrypted . PHP_EOL;
// Wichtig · Fallstricke
Sicherheitshinweis: Diese Funktion bietet keine Authentifizierung. Ein Angreifer kann den Chiffretext manipulieren, ohne dass dies erkannt wird (Bit-Flipping-Angriffe). Für produktiven Einsatz sollte stets sodium_crypto_aead_xchacha20poly1305_ietf_encrypt verwendet werden, das Vertraulichkeit und Integrität kombiniert.
Nonce-Wiederverwendung: Die Nonce darf bei gleichem Schlüssel niemals wiederverwendet werden. Andernfalls kann der Klartext durch XOR zweier Chiffretexte direkt rekonstruiert werden. Bei zufälliger Nonce-Wahl ist die Kollisionswahrscheinlichkeit bei XChaCha20 wegen der 192-Bit-Nonce vernachlässigbar gering.
Die Konstante SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES hat den Wert 24, SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES hat den Wert 32.