Start · Sprachen · PHP · Referenz · sodium_crypto_stream_xchacha20

sodium_crypto_stream_xchacha20

Funktion

Expandiert einen Schlüssel und eine Nonce zu einem Strom pseudozufälliger Bytes auf Basis des XChaCha20-Algorithmus.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_stream_xchacha20(int $length, string $nonce, string $key): string

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

Typ
string
Beschreibung
Gibt einen binären String der angeforderten Länge mit pseudozufälligen Bytes zurück. Im Fehlerfall (z. B. ungültige Parameterlängen) wird eine 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;
Länge des Stroms: 64 Bytes Hex: <64 zufällige Hex-Zeichen>

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;
Ciphertext (hex): <hex-codierter Chiffretext> Entschlüsselt: Geheime Nachricht!

// 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.