Signatur
Beschreibung
mcrypt_decrypt() entschlüsselt übergebene Chiffretextdaten ($data) mit dem gewählten symmetrischen Algorithmus ($cipher), dem geheimen Schlüssel ($key) und dem Betriebsmodus ($mode). Der zurückgegebene Klartext kann mit Null-Bytes aufgefüllt (padded) sein, da mcrypt intern blockweise arbeitet.
Als $cipher werden Konstanten wie MCRYPT_RIJNDAEL_128 (AES-128), MCRYPT_DES oder MCRYPT_BLOWFISH verwendet. Der Betriebsmodus wird über Konstanten wie MCRYPT_MODE_CBC, MCRYPT_MODE_ECB oder MCRYPT_MODE_CFB angegeben.
Achtung: Die gesamte mcrypt-Erweiterung wurde in PHP 7.1 als deprecated markiert und in PHP 7.2 vollständig entfernt. Für neuen Code sollte ausschließlich openssl_decrypt() oder die sodium-Erweiterung (libsodium) verwendet werden, da diese modernen Sicherheitsstandards entsprechen.
Ein häufiges Problem bei mcrypt_decrypt() ist, dass der zurückgegebene Klartext mit \0-Zeichen aufgefüllt sein kann. Diese müssen nach der Entschlüsselung mit rtrim($plaintext, "\0") entfernt werden, sofern die ursprünglichen Daten kein binäres Padding verwenden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $cipher Pflicht | string | Der zu verwendende Verschlüsselungsalgorithmus, z. B. MCRYPT_RIJNDAEL_128, MCRYPT_DES oder MCRYPT_BLOWFISH. |
|
| $key Pflicht | string | Der geheime Schlüssel zur Entschlüsselung. Die Länge muss dem gewählten Algorithmus entsprechen; zu kurze Schlüssel werden intern mit Null-Bytes aufgefüllt. | |
| $data Pflicht | string | Der zu entschlüsselnde Chiffretext (verschlüsselte Binärdaten). | |
| $mode Pflicht | string | Der Betriebsmodus, z. B. MCRYPT_MODE_CBC, MCRYPT_MODE_ECB, MCRYPT_MODE_CFB oder MCRYPT_MODE_OFB. |
|
| $iv | string | Der Initialisierungsvektor (IV), der beim Verschlüsseln verwendet wurde. Pflicht für Modi wie CBC oder CFB; wird für ECB ignoriert. Muss dieselbe Länge wie die Blockgröße des Algorithmus haben. |
Rückgabewert
\0-Bytes aufgefüllt sein. Bei einem Fehler wird false zurückgegeben.Beispiele
Einfache AES-128-CBC-Entschlüsselung (PHP < 7.1)
<?php
// Dieser Code läuft nur auf PHP-Versionen < 7.2 mit installierter mcrypt-Erweiterung
$cipher = MCRYPT_RIJNDAEL_128; // AES-128
$mode = MCRYPT_MODE_CBC;
$key = 'eingeheimerschl1'; // 16 Byte für AES-128
$iv = 'zufaelligeriv123'; // 16 Byte Initialisierungsvektor
// Verschlüsselung (nur zur Demonstration)
$plaintext = 'Geheimer Text';
$ciphertext = mcrypt_encrypt($cipher, $key, $plaintext, $mode, $iv);
// Entschlüsselung
$decrypted = mcrypt_decrypt($cipher, $key, $ciphertext, $mode, $iv);
// Null-Byte-Padding entfernen
$decrypted = rtrim($decrypted, "\0");
echo $decrypted; // Geheimer Text
Migration zu openssl_decrypt (empfohlene Alternative)
<?php
// Moderner Ersatz für mcrypt_decrypt mit OpenSSL
$key = 'eingeheimerschl1'; // 16 Byte für AES-128
$iv = random_bytes(16); // Zufälligen IV erzeugen
$plaintext = 'Geheimer Text';
// Verschlüsseln
$ciphertext = openssl_encrypt($plaintext, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
// Entschlüsseln
$decrypted = openssl_decrypt($ciphertext, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
echo $decrypted; // Geheimer Text
// Wichtig · Fallstricke
Deprecated seit PHP 7.1, entfernt in PHP 7.2: Die mcrypt-Erweiterung gilt als veraltet, unsicher und wird nicht mehr gepflegt. Bestehender Code sollte auf openssl_decrypt() oder sodium_crypto_secretbox_open() migriert werden.
Sicherheitsprobleme: mcrypt bietet keinerlei Authenticated Encryption (z. B. HMAC oder GCM-Tag). Ohne Integritätsprüfung sind Chiffretexte anfällig für Padding-Oracle-Angriffe und Manipulationen. Immer eine separate MAC (z. B. hash_hmac()) verwenden oder gleich auf AES-GCM über OpenSSL setzen.
ECB-Modus vermeiden: MCRYPT_MODE_ECB ist kryptografisch unsicher, da identische Klartextblöcke zu identischen Chiffretextblöcken führen. CBC oder besser GCM verwenden.
Schlüssellänge: Zu kurze Schlüssel werden intern mit Null-Bytes aufgefüllt, ohne Fehlermeldung — dies führt zu schwachen Schlüsseln. Die Schlüssellänge sollte explizit auf die Anforderungen des Algorithmus geprüft werden.