Signatur
Beschreibung
mdecrypt_generic() entschlüsselt einen verschlüsselten String mithilfe des angegebenen mcrypt-Deskriptors. Der Deskriptor muss zuvor mit mcrypt_generic_init() initialisiert worden sein, wobei Schlüssel und Initialisierungsvektor (IV) gesetzt werden. Nach Abschluss aller Kryptografie-Operationen sollte mcrypt_generic_deinit() aufgerufen werden, um die zugewiesenen Ressourcen freizugeben.
Da mcrypt intern mit Blöcken fester Größe arbeitet, wird der beim Verschlüsseln ggf. hinzugefügte Padding-Bereich (Null-Bytes bis zur Blockgröße) im entschlüsselten Ergebnis ebenfalls zurückgegeben. Die Anwendung muss das Padding selbst entfernen, etwa mit rtrim($result, "\0"), sofern der Klartext kein abschließendes Null-Byte enthält.
Achtung: Die gesamte mcrypt-Erweiterung ist seit PHP 7.1.0 deprecated und wurde in PHP 7.2.0 aus dem PHP-Kern entfernt. Für neue Projekte sollte ausschließlich openssl_decrypt() oder die sodium-Erweiterung (libsodium) verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $td Pflicht | resource | Ein mcrypt-Verschlüsselungsdeskriptor, wie er von mcrypt_module_open() zurückgegeben und anschließend mit mcrypt_generic_init() initialisiert wurde. |
|
| $data Pflicht | string | Der zu entschlüsselnde Geheimtext (Ciphertext). Die Länge muss ein Vielfaches der Blockgröße des gewählten Algorithmus sein. |
Rückgabewert
Beispiele
Einfaches Ver- und Entschlüsseln mit 3DES
<?php
// Nur illustrativ – mcrypt ist in PHP >= 7.2 nicht mehr verfügbar!
$algorithm = MCRYPT_3DES;
$mode = MCRYPT_MODE_CBC;
$key = 'EinSchlu3ss3lXX'; // 3DES: 16 oder 24 Byte
$iv = 'IVacht!1'; // 3DES/CBC: 8 Byte
$plaintext = 'Geheimer Text';
// Verschlüsseln
$td = mcrypt_module_open($algorithm, '', $mode, '');
mcrypt_generic_init($td, $key, $iv);
$ciphertext = mcrypt_generic($td, $plaintext);
mcrypt_generic_deinit($td);
// Entschlüsseln
mcrypt_generic_init($td, $key, $iv);
$decrypted = mdecrypt_generic($td, $ciphertext);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
// Null-Byte-Padding entfernen
$result = rtrim($decrypted, "\0");
echo $result;
Moderne Alternative mit openssl_decrypt (empfohlen)
<?php
// Empfohlene Alternative für PHP 7.2+
$key = openssl_random_pseudo_bytes(32); // 256-Bit-Schlüssel
$iv = openssl_random_pseudo_bytes(16); // 128-Bit-IV
$plaintext = 'Geheimer Text';
$ciphertext = openssl_encrypt($plaintext, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
$decrypted = openssl_decrypt($ciphertext, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
echo $decrypted;
// Wichtig · Fallstricke
Deprecated seit PHP 7.1.0, entfernt in PHP 7.2.0: Die gesamte mcrypt-Erweiterung gilt als unsicher und wird nicht mehr gepflegt. Sie sollte in keinem neuen Code verwendet werden.
- Null-Byte-Padding: mcrypt füllt den letzten Block mit
\0-Bytes auf. Beim Entschlüsseln müssen diese manuell entfernt werden – jedoch nur, wenn der originale Klartext kein abschließendes Null-Byte enthält. - Authentifizierung fehlt: mcrypt bietet keine Message Authentication (MAC/HMAC). Ohne zusätzliche Integritätsprüfung sind entschlüsselte Daten anfällig für Manipulationsangriffe (Padding-Oracle, Bit-Flipping). Verwende stattdessen AES-GCM via
openssl_decrypt()odersodium_crypto_secretbox_open(). - Der IV muss beim Entschlüsseln identisch zum beim Verschlüsseln verwendeten IV sein. Er darf nicht geheim sein, muss aber eindeutig und nicht vorhersagbar erzeugt werden.