Start · Sprachen · PHP · Referenz · mcrypt_create_iv

mcrypt_create_iv

Funktion

Erzeugt einen Initialisierungsvektor (IV) der angegebenen Länge aus einer wählbaren Zufallsquelle.

seit PHP 4.0.2 Kategorie: crypto

Signatur

mcrypt_create_iv(int $size, int $source = MCRYPT_DEV_URANDOM): string|false

Beschreibung

mcrypt_create_iv() generiert einen Initialisierungsvektor (IV) mit der gewünschten Länge in Bytes. Ein IV ist bei den meisten symmetrischen Verschlüsselungsverfahren zwingend erforderlich, um gleiche Klartexte zu unterschiedlichen Geheimtexten zu verschlüsseln und so Muster im Chiffretext zu verhindern.

Die Funktion unterstützt verschiedene Zufallsquellen: MCRYPT_DEV_RANDOM liest aus /dev/random (blockierend, hohe Entropie), MCRYPT_DEV_URANDOM liest aus /dev/urandom (nicht blockierend, für die meisten Anwendungsfälle ausreichend) und MCRYPT_RAND nutzt den einfachen PHP-Zufallszahlengenerator (nicht kryptographisch sicher, nur für Tests geeignet).

Die Länge des IV hängt vom verwendeten Verschlüsselungsalgorithmus und Modus ab. Die korrekte Länge lässt sich mit mcrypt_get_iv_size() ermitteln. Der IV muss nicht geheim gehalten werden, sollte aber für jede Verschlüsselung einmalig und zufällig sein; er wird üblicherweise zusammen mit dem Geheimtext gespeichert oder übertragen.

Achtung: Die gesamte mcrypt-Erweiterung wurde in PHP 7.1 als veraltet markiert und in PHP 7.2 entfernt. Für neuen Code sollte stattdessen openssl_random_pseudo_bytes() oder random_bytes() zur IV-Erzeugung und openssl_encrypt()/openssl_decrypt() zur Verschlüsselung verwendet werden.

Parameter

Name Typ Default Beschreibung
$size Pflicht int Gewünschte Länge des Initialisierungsvektors in Bytes. Sollte mit mcrypt_get_iv_size() für den jeweiligen Algorithmus und Modus ermittelt werden.
$source int MCRYPT_DEV_URANDOM Zufallsquelle für die IV-Erzeugung. Mögliche Werte: MCRYPT_DEV_RANDOM, MCRYPT_DEV_URANDOM (empfohlen) oder MCRYPT_RAND (unsicher, nur für Tests).

Rückgabewert

Typ
string|false
Beschreibung
Gibt bei Erfolg einen String mit dem erzeugten Initialisierungsvektor der angegebenen Länge zurück. Im Fehlerfall (z. B. ungültige Länge oder nicht verfügbare Quelle) wird false zurückgegeben.

Beispiele

IV erzeugen und Daten mit AES-256-CBC verschlüsseln

<?php
// Nur auf Systemen mit mcrypt-Erweiterung (PHP < 7.2) lauffähig
$algorithm = MCRYPT_RIJNDAEL_128;
$mode      = MCRYPT_MODE_CBC;
$key       = 'geheimerschluessel12345678901234'; // 32 Byte für AES-256

// Korrekte IV-Länge für den Algorithmus ermitteln
$ivSize = mcrypt_get_iv_size($algorithm, $mode);

// IV aus /dev/urandom erzeugen (empfohlen)
$iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_URANDOM);

$plaintext  = 'Geheimer Text';
$ciphertext = mcrypt_encrypt($algorithm, $key, $plaintext, $mode, $iv);

// IV und Geheimtext zusammen speichern/übertragen
$stored = base64_encode($iv . $ciphertext);
echo $stored;
(base64-kodierter String aus IV + Geheimtext, variiert je nach Zufalls-IV)

Moderne Alternative mit random_bytes() und openssl_encrypt()

<?php
// Empfohlener Ansatz für PHP 7.0+
$cipher = 'AES-256-CBC';
$key    = random_bytes(32); // 256 Bit Schlüssel
$iv     = random_bytes(openssl_cipher_iv_length($cipher)); // IV-Länge automatisch

$plaintext  = 'Geheimer Text';
$ciphertext = openssl_encrypt($plaintext, $cipher, $key, OPENSSL_RAW_DATA, $iv);

// IV + Geheimtext base64-kodiert speichern
$stored = base64_encode($iv . $ciphertext);
echo $stored;
(base64-kodierter String aus IV + Geheimtext, variiert je nach Zufalls-IV)

// Wichtig · Fallstricke

Deprecation: mcrypt_create_iv() und die gesamte mcrypt-Erweiterung sind seit PHP 7.1 als veraltet (deprecated) markiert und wurden in PHP 7.2 vollständig entfernt. Für alle aktuellen Projekte sollten random_bytes() zur IV/Nonce-Erzeugung und die openssl_*-Funktionen zur Verschlüsselung verwendet werden.

Sicherheit: Verwende niemals MCRYPT_RAND in Produktivsystemen, da der einfache PHP-Zufallsgenerator nicht kryptographisch sicher ist. MCRYPT_DEV_URANDOM ist auf Linux/macOS für die meisten Zwecke ausreichend sicher.

IV-Wiederverwendung: Ein IV darf bei gleichem Schlüssel niemals zweimal verwendet werden, da dies Angriffe auf den Geheimtext ermöglicht. Erzeuge für jede Verschlüsselung einen neuen, zufälligen IV.