Start · Sprachen · PHP · Referenz · mcrypt_encrypt

mcrypt_encrypt

Funktion

Verschlüsselt einen Klartext-String mit dem angegebenen Algorithmus und Modus (veraltet seit PHP 7.1, entfernt in PHP 7.2).

seit PHP 4.0.2 Kategorie: crypto

Signatur

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

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

Typ
string|false
Beschreibung
Gibt den verschlüsselten Datenstring als Binärstring zurück oder 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;
// Base64-kodierter String aus IV + verschlüsselten Daten (variiert je nach IV)

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";
Verschlüsselt: <base64-String> Entschlüsselt: Meine geheime Nachricht

// 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 mit rtrim($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_ECB ist 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.