Start · Sprachen · PHP · Referenz · mdecrypt_generic

mdecrypt_generic

Funktion

Entschlüsselt Daten mit dem zuvor initialisierten mcrypt-Handle <code>$td</code> und gibt den entschlüsselten Klartext zurück.

seit PHP 4.0.2 Kategorie: crypto

Signatur

mdecrypt_generic(resource $td, string $data): string

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

Typ
string
Beschreibung
Gibt den entschlüsselten Klartext als String zurück. Durch das Block-Padding können am Ende Null-Bytes vorhanden sein, die ggf. manuell entfernt werden müssen.

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;
Geheimer Text

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;
Geheimer Text

// 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() oder sodium_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.