Signatur
Beschreibung
mcrypt_generic() verschlüsselt die in $data übergebenen Daten mithilfe des zuvor mit mcrypt_module_open() geöffneten und mit mcrypt_generic_init() initialisierten Verschlüsselungs-Deskriptors. Der Rückgabewert ist der verschlüsselte Ciphertext als Binärstring.
Wichtig: Die Länge des zurückgegebenen Strings entspricht immer einem Vielfachen der Blockgröße des verwendeten Algorithmus. Wenn die Eingabe kein Vielfaches der Blockgröße ist, wird sie automatisch mit Nullbytes (\0) aufgefüllt. Das Auffüllen muss beim Entschlüsseln (mit mdecrypt_generic()) berücksichtigt und anschließend manuell entfernt werden.
Vor dem Aufruf muss immer zuerst mcrypt_module_open() und dann mcrypt_generic_init() aufgerufen werden, um den Schlüssel und den Initialisierungsvektor (IV) zu setzen. Nach der Nutzung sollten die Ressourcen mit mcrypt_generic_deinit() und mcrypt_module_close() freigegeben werden.
Achtung: Die gesamte mcrypt-Erweiterung ist seit PHP 7.1 als deprecated markiert und wurde in PHP 7.2 vollständig entfernt. Für neue Projekte sollte stattdessen openssl_encrypt() oder die sodium-Erweiterung verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $td Pflicht | resource | Ein Verschlüsselungs-Deskriptor (Ressource), der zuvor mit mcrypt_module_open() geöffnet und mit mcrypt_generic_init() initialisiert wurde. |
|
| $data Pflicht | string | Die zu verschlüsselnden Klartextdaten als String. Wird automatisch mit Nullbytes aufgefüllt, falls die Länge kein Vielfaches der Blockgröße des Algorithmus ist. |
Rückgabewert
Beispiele
Einfache Verschlüsselung mit AES-256-ECB
<?php
$key = 'eingeheimerSchluessel12345678901'; // 32 Byte für AES-256
$data = 'Geheime Nachricht';
// Algorithmus und Modus öffnen
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
// IV-Größe ermitteln und IV erzeugen
$ivSize = mcrypt_enc_get_iv_size($td);
$iv = str_repeat('\0', $ivSize); // Nur für ECB; im echten Code sicher generieren!
// Mit Schlüssel und IV initialisieren
mcrypt_generic_init($td, $key, $iv);
// Daten verschlüsseln
$encrypted = mcrypt_generic($td, $data);
// Ressourcen freigeben
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo base64_encode($encrypted);
// Ausgabe: ein Base64-kodierter Ciphertext
Ver- und Entschlüsseln mit CBC und anschließendem Padding-Trimming
<?php
$key = 'MeinSchluessel16'; // 16 Byte für AES-128
$data = 'Hallo Welt';
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_URANDOM);
// Verschlüsseln
mcrypt_generic_init($td, $key, $iv);
$ciphertext = mcrypt_generic($td, $data);
mcrypt_generic_deinit($td);
// Entschlüsseln
mcrypt_generic_init($td, $key, $iv);
$plaintext = mdecrypt_generic($td, $ciphertext);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
// Null-Byte-Padding entfernen
$plaintext = rtrim($plaintext, "\0");
echo $plaintext; // Hallo Welt
// Wichtig · Fallstricke
Deprecated seit PHP 7.1, entfernt in PHP 7.2: mcrypt_generic() und die gesamte mcrypt-Erweiterung sollten nicht mehr verwendet werden. Empfohlene Alternativen sind openssl_encrypt() für symmetrische Verschlüsselung oder die sodium-Erweiterung (z. B. sodium_crypto_secretbox()).
Padding-Falle: Weil mcrypt_generic() die Eingabe mit Nullbytes auffüllt, können Klartexte, die selbst mit \0 enden, nach der Entschlüsselung fälschlicherweise verkürzt werden, wenn rtrim(..., "\0") verwendet wird. Speichern Sie daher stets die originale Länge der Eingabedaten oder verwenden Sie ein explizites Padding-Schema (z. B. PKCS#7).
Sicherheitshinweis: Verwenden Sie niemals ECB-Modus für sensitive Daten, da er keine semantische Sicherheit bietet. CBC mit zufälligem IV und einer HMAC-Authentifizierung (Encrypt-then-MAC) ist ein Mindeststandard — besser ist die Verwendung moderner AEAD-Verfahren wie AES-GCM über openssl_encrypt().