Signatur
Beschreibung
sodium_crypto_stream erzeugt einen Pseudozufalls-Bytestream (Keystream) fester Länge, der vollständig durch den geheimen Schlüssel ($key) und den Nonce ($nonce) bestimmt wird. Intern verwendet die Funktion den XSalsa20-Streamcipher. Da der Keystream bei gleichen Eingaben immer identisch ist, gilt er als deterministisch.
Typische Einsatzgebiete sind die manuelle XOR-Verschlüsselung von Klartextdaten sowie die Erzeugung deterministischer Pseudozufallsdaten für Tests oder Key-Derivation. Für die direkte Verschlüsselung von Nachrichten empfiehlt es sich jedoch, stattdessen sodium_crypto_stream_xor zu verwenden, das den XOR-Schritt bereits eingebaut hat.
Der Schlüssel sollte exakt SODIUM_CRYPTO_STREAM_KEYBYTES (32 Byte) lang sein und kann bequem mit sodium_crypto_stream_keygen erzeugt werden. Der Nonce muss SODIUM_CRYPTO_STREAM_NONCEBYTES (24 Byte) lang sein und darf für denselben Schlüssel niemals wiederverwendet werden, da sonst die Sicherheit vollständig bricht.
Der zurückgegebene Bytestream enthält keine Authentifizierung. Wer zusätzlich Integrität und Authentizität benötigt, sollte sodium_crypto_secretbox oder sodium_crypto_aead_*-Funktionen verwenden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $length Pflicht | int | Anzahl der zu erzeugenden Bytes. Muss eine positive ganze Zahl sein. | |
| $nonce Pflicht | string | Einmaliger Zufallswert (Number used Once) der Länge SODIUM_CRYPTO_STREAM_NONCEBYTES (24 Byte). Darf für denselben Schlüssel niemals zweimal verwendet werden. |
|
| $key Pflicht | string | Geheimer Schlüssel der Länge SODIUM_CRYPTO_STREAM_KEYBYTES (32 Byte). Sollte mit sodium_crypto_stream_keygen erzeugt werden. |
Rückgabewert
SodiumException geworfen.Beispiele
Deterministischen Keystream erzeugen und als Hex ausgeben
<?php
// Schlüssel und Nonce erzeugen
$key = sodium_crypto_stream_keygen(); // 32 Byte
$nonce = random_bytes(SODIUM_CRYPTO_STREAM_NONCEBYTES); // 24 Byte
// 64 Byte Keystream erzeugen
$stream = sodium_crypto_stream(64, $nonce, $key);
echo 'Länge: ' . strlen($stream) . ' Bytes' . PHP_EOL;
echo 'Hex: ' . sodium_bin2hex($stream) . PHP_EOL;
// Deterministisch: gleiche Eingaben → gleicher Output
$stream2 = sodium_crypto_stream(64, $nonce, $key);
var_dump($stream === $stream2); // true
Manuelle XOR-Verschlüsselung mit dem Keystream
<?php
$key = sodium_crypto_stream_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_STREAM_NONCEBYTES);
$plaintext = 'Geheime Nachricht!';
// Keystream in Klartextlänge erzeugen
$keystream = sodium_crypto_stream(strlen($plaintext), $nonce, $key);
// XOR-Verschlüsselung (entspricht sodium_crypto_stream_xor)
$ciphertext = $plaintext ^ $keystream;
// Entschlüsselung: erneut XOR mit demselben Keystream
$decrypted = $ciphertext ^ $keystream;
echo $decrypted . PHP_EOL; // Geheime Nachricht!
// Speicher sicher löschen
sodium_memzero($keystream);
sodium_memzero($key);
// Wichtig · Fallstricke
Nonce-Wiederverwendung ist kritisch: Wird derselbe Nonce mit demselben Schlüssel für zwei verschiedene Nachrichten verwendet, kann ein Angreifer durch einfaches XOR der Ciphertexte den Klartext rekonstruieren. Nonces sollten daher immer mit random_bytes(SODIUM_CRYPTO_STREAM_NONCEBYTES) zufällig gewählt werden.
Keine Authentifizierung: sodium_crypto_stream bietet keinerlei Integritätsschutz. Für authentifizierte Verschlüsselung sollte sodium_crypto_secretbox oder eine sodium_crypto_aead_*-Funktion genutzt werden.
Für die häufigste Anwendung – Klartext XOR-verschlüsseln – ist sodium_crypto_stream_xor direkter und weniger fehleranfällig, da es Keystream-Erzeugung und XOR-Schritt kombiniert.