Start · Sprachen · PHP · Referenz · mcrypt_generic_init

mcrypt_generic_init

Funktion

Initialisiert alle für die Verschlüsselung benötigten Puffer eines mcrypt-Deskriptors mit Schlüssel und Initialisierungsvektor.

seit PHP 4.0.2 Kategorie: crypto

Signatur

mcrypt_generic_init(resource $td, string $key, string $iv): int

Beschreibung

mcrypt_generic_init() bereitet einen zuvor mit mcrypt_module_open() geöffneten Verschlüsselungs-Deskriptor auf den eigentlichen Einsatz vor. Dabei werden der symmetrische Schlüssel ($key) und ein Initialisierungsvektor ($iv) in die internen Puffer des Deskriptors geladen. Ohne diesen Schritt können mcrypt_generic() und mdecrypt_generic() nicht genutzt werden.

Die Länge von $key und $iv muss den Anforderungen des gewählten Algorithmus und Modus entsprechen. Die maximal erlaubte Schlüssellänge lässt sich mit mcrypt_enc_get_key_size() ermitteln, die benötigte IV-Länge mit mcrypt_enc_get_iv_size(). Ist der Schlüssel zu kurz, wird er automatisch mit Nullbytes aufgefüllt; ist er zu lang, wird er abgeschnitten.

Nach getaner Arbeit sollte der Deskriptor mit mcrypt_generic_deinit() bereinigt und mit mcrypt_module_close() geschlossen werden, um Ressourcen freizugeben.

Achtung: Die gesamte mcrypt-Erweiterung gilt seit PHP 7.1 als veraltet (deprecated) und wurde mit PHP 7.2 vollständig entfernt. Für neue Projekte sollte stattdessen openssl_encrypt()/openssl_decrypt() oder die Sodium-Erweiterung (sodium_crypto_secretbox()) verwendet werden.

Parameter

Name Typ Default Beschreibung
$td Pflicht resource Der Verschlüsselungs-Deskriptor, der zuvor mit mcrypt_module_open() geöffnet wurde.
$key Pflicht string Der symmetrische Schlüssel für den Verschlüsselungsalgorithmus. Die maximale Länge ist algorithmusabhängig; zu kurze Schlüssel werden mit Nullbytes aufgefüllt, zu lange werden abgeschnitten.
$iv Pflicht string Der Initialisierungsvektor (IV). Die benötigte Länge ist modus- und algorithmusabhängig und kann mit mcrypt_enc_get_iv_size() abgefragt werden. Bei Algorithmen/Modi ohne IV-Anforderung kann ein leerer String übergeben werden.

Rückgabewert

Typ
int
Beschreibung
Gibt -3 zurück, wenn der Schlüssel zu lang ist, -4 bei einem Speicherproblem, einen negativen Wert bei sonstigem Fehler und 0 bei Erfolg. Der Rückgabewert sollte stets geprüft werden, bevor weitergemacht wird.

Beispiele

Einfache symmetrische Verschlüsselung mit CBC

<?php
// Nur in PHP < 7.2 verfügbar!
$algorithm = MCRYPT_RIJNDAEL_128;
$mode      = MCRYPT_MODE_CBC;

$td = mcrypt_module_open($algorithm, '', $mode, '');

// Schlüssel und IV in der richtigen Länge erzeugen
$ivSize  = mcrypt_enc_get_iv_size($td);
$keySize = mcrypt_enc_get_key_size($td);

$iv  = random_bytes($ivSize);
$key = substr(hash('sha256', 'geheimes-passwort', true), 0, $keySize);

$result = mcrypt_generic_init($td, $key, $iv);
if ($result < 0) {
    die('Initialisierung fehlgeschlagen: ' . $result);
}

$plaintext  = 'Geheime Nachricht!';
$ciphertext = mcrypt_generic($td, $plaintext);

echo 'Verschlüsselt (hex): ' . bin2hex($ciphertext) . PHP_EOL;

mcrypt_generic_deinit($td);
mcrypt_module_close($td);
Verschlüsselt (hex): <zufälliger Hex-String>

Verschlüsselung und anschließende Entschlüsselung

<?php
// Nur in PHP < 7.2 verfügbar!
$algorithm = MCRYPT_RIJNDAEL_128;
$mode      = MCRYPT_MODE_CBC;

$td      = mcrypt_module_open($algorithm, '', $mode, '');
$ivSize  = mcrypt_enc_get_iv_size($td);
$keySize = mcrypt_enc_get_key_size($td);

$iv      = random_bytes($ivSize);
$key     = substr(hash('sha256', 'mein-schlüssel', true), 0, $keySize);
$message = 'Hallo Welt!';

// Verschlüsseln
mcrypt_generic_init($td, $key, $iv);
$encrypted = mcrypt_generic($td, $message);
mcrypt_generic_deinit($td);

// Entschlüsseln (gleicher Deskriptor, neu initialisiert)
mcrypt_generic_init($td, $key, $iv);
$decrypted = mdecrypt_generic($td, $encrypted);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

echo rtrim($decrypted, "\0") . PHP_EOL;
Hallo Welt!

// Wichtig · Fallstricke

Deprecation: mcrypt_generic_init() und die gesamte mcrypt-Erweiterung sind seit PHP 7.1 als veraltet markiert und wurden mit PHP 7.2 entfernt. Bestehender Code sollte auf openssl_encrypt()/openssl_decrypt() oder die Natrium-Erweiterung (sodium_crypto_secretbox()) migriert werden.

Sicherheit: Der IV muss für jede Verschlüsselung kryptografisch zufällig und einmalig sein (z. B. mit random_bytes() erzeugt). Ein fester oder vorhersehbarer IV schwächt den CBC-Modus erheblich.

Schlüssellänge: Die stille Auffüllung kurzer Schlüssel mit Nullbytes kann zu einem effektiv schwachen Schlüssel führen. Schlüssel sollten stets die volle empfohlene Länge haben.

Ressourcenverwaltung: Nach jeder Initialisierung muss mcrypt_generic_deinit() aufgerufen werden, bevor mcrypt_generic_init() erneut auf demselben Deskriptor aufgerufen wird oder dieser geschlossen wird.