Start · Sprachen · PHP · Referenz · sodium_crypto_stream

sodium_crypto_stream

Funktion

Erzeugt eine deterministische, kryptografisch zufällig erscheinende Byte-Folge (Keystream) aus einem Nonce und einem geheimen Schlüssel.

seit PHP 7.2.0 Kategorie: crypto

Signatur

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

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

Typ
string
Beschreibung
Gibt einen binären String der angeforderten Länge zurück, der den erzeugten Keystream enthält. Im Fehlerfall (z. B. ungültige Parameterlängen) wird eine 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
Länge: 64 Bytes Hex: <64 hex-kodierte Bytes> bool(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);
Geheime Nachricht!

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