Signatur
Beschreibung
mcrypt_encrypt() gehört zur MCrypt-Erweiterung und verschlüsselt einen beliebigen Datenstring mithilfe eines symmetrischen Verschlüsselungsalgorithmus (z. B. AES/Rijndael, DES, Blowfish). Der Klartext wird dabei mit dem angegebenen Schlüssel, dem Betriebsmodus und – sofern erforderlich – einem Initialisierungsvektor (IV) verschlüsselt.
Achtung: Die MCrypt-Erweiterung gilt seit PHP 7.1.0 als veraltet und wurde in PHP 7.2.0 vollständig entfernt. Für neue Projekte und Migrationen wird dringend empfohlen, stattdessen openssl_encrypt() oder die sodium_*-Funktionen (libsodium) zu verwenden, da diese aktiv gepflegt werden und moderne kryptografische Standards unterstützen.
Die Funktion füllt den Klartext automatisch mit Null-Bytes auf, damit seine Länge ein Vielfaches der Blockgröße des gewählten Algorithmus ergibt (Zero-Padding). Beim Entschlüsseln und anschließenden Verwenden der Daten muss dieses Padding manuell entfernt werden (rtrim($decrypted, "\0")).
Der zurückgegebene verschlüsselte String enthält Binärdaten und sollte für die Übertragung oder Speicherung z. B. mittels base64_encode() kodiert werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $cipher Pflicht | string | Der zu verwendende Verschlüsselungsalgorithmus, z. B. MCRYPT_RIJNDAEL_128, MCRYPT_DES oder MCRYPT_BLOWFISH. Muss eine der von MCrypt unterstützten Konstanten oder der entsprechende Algorithmusname als String sein. |
|
| $key Pflicht | string | Der geheime Schlüssel zur Verschlüsselung. Die zulässige Schlüssellänge hängt vom gewählten Algorithmus ab (z. B. 16, 24 oder 32 Byte für AES). Ist der Schlüssel zu kurz, wird er automatisch mit Null-Bytes aufgefüllt; zu lange Schlüssel werden abgeschnitten. | |
| $data Pflicht | string | Der zu verschlüsselnde Klartext als String. Kann beliebige Binärdaten enthalten. Wird automatisch mit Null-Bytes auf ein Vielfaches der Blockgröße aufgefüllt. | |
| $mode Pflicht | string | Der Betriebsmodus des Blockverschlüsselungsalgorithmus, z. B. MCRYPT_MODE_CBC, MCRYPT_MODE_ECB, MCRYPT_MODE_CFB oder MCRYPT_MODE_OFB. Der CBC-Modus ist für die meisten Anwendungsfälle geeignet. |
|
| $iv | string | Der Initialisierungsvektor (IV) für Modi, die einen IV erfordern (z. B. CBC, CFB, OFB). Die Länge muss exakt der Blockgröße des Algorithmus entsprechen. Für ECB wird kein IV benötigt. Der IV muss zufällig und für jede Verschlüsselung einmalig sein. |
Rückgabewert
false im Fehlerfall (z. B. bei ungültigem Algorithmus oder Modus). Der Rückgabewert enthält Binärdaten und sollte für sichere Übertragung base64-kodiert werden.Beispiele
AES-128-CBC-Verschlüsselung mit mcrypt_encrypt (Legacy-Code)
<?php
// WARNUNG: Nur für Demonstrationszwecke – MCrypt ist seit PHP 7.2 entfernt!
$key = 'geheimerschluesl'; // 16 Byte für AES-128
$iv = mcrypt_create_iv(
mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
MCRYPT_RAND
);
$plaintext = 'Meine geheime Nachricht';
$encrypted = mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
$key,
$plaintext,
MCRYPT_MODE_CBC,
$iv
);
// IV und verschlüsselte Daten zusammen speichern/übertragen
$encoded = base64_encode($iv . $encrypted);
echo $encoded;
Migration zu openssl_encrypt (empfohlene Alternative)
<?php
// Moderner Ersatz für mcrypt_encrypt mit openssl_encrypt
$key = openssl_random_pseudo_bytes(16); // 16 Byte = AES-128
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES-128-CBC'));
$plaintext = 'Meine geheime Nachricht';
// Verschlüsseln
$encrypted = openssl_encrypt($plaintext, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
$stored = base64_encode($iv . $encrypted);
echo "Verschlüsselt: " . $stored . "\n";
// Entschlüsseln
$decoded = base64_decode($stored);
$ivLen = openssl_cipher_iv_length('AES-128-CBC');
$iv2 = substr($decoded, 0, $ivLen);
$cipher = substr($decoded, $ivLen);
$decrypted = openssl_decrypt($cipher, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv2);
echo "Entschlüsselt: " . $decrypted . "\n";
// Wichtig · Fallstricke
Sicherheitswarnung: mcrypt_encrypt() sollte in keinem neuen Code mehr verwendet werden. Die MCrypt-Bibliothek wird seit Jahren nicht mehr aktiv gepflegt und gilt als unsicher. Verwende stattdessen openssl_encrypt() oder die sodium_crypto_secretbox()-Familie aus der libsodium-Erweiterung.
- Zero-Padding: Die automatische Auffüllung mit Null-Bytes (
\0) ist nicht dasselbe wie PKCS#7-Padding. Nach der Entschlüsselung müssen Nullbytes mitrtrim($result, "\0")entfernt werden – dabei können jedoch Nutzdaten verloren gehen, wenn der Klartext selbst mit Nullbytes endet. - ECB-Modus vermeiden: Der Modus
MCRYPT_MODE_ECBist kryptografisch unsicher, da gleiche Klartextblöcke identische Chiffretextblöcke erzeugen. Immer CBC oder besser authentifizierte Modi (z. B. GCM über OpenSSL) bevorzugen. - Keine Authentizität:
mcrypt_encrypt()bietet keine Nachrichtenauthentisierung (kein MAC/HMAC). Ohne zusätzlichen Integritätsschutz sind Chosen-Ciphertext-Angriffe möglich. - PHP-Versionen: Veraltet ab PHP 7.1.0 (E_DEPRECATED-Warnung), vollständig entfernt in PHP 7.2.0.