Signatur
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
-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ü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;
// 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.