Start · Sprachen · PHP · Referenz · mcrypt_decrypt

mcrypt_decrypt

Funktion

Entschlüsselt einen verschlüsselten String mit dem angegebenen Algorithmus, Schlüssel, Modus und optionalem Initialisierungsvektor.

seit PHP 4.0.2 Kategorie: crypto

Signatur

mcrypt_decrypt(string $cipher, string $key, string $data, string $mode, string $iv = ''): string|false

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

Typ
string|false
Beschreibung
Gibt den entschlüsselten Klartext als String zurück. Der String kann am Ende mit \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
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
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.