Start · Sprachen · PHP · Referenz · mcrypt_generic

mcrypt_generic

Funktion

Verschlüsselt einen String mit dem über <code>mcrypt_generic_init()</code> initialisierten Verschlüsselungs-Handle.

seit PHP 4.0.2 Kategorie: crypto

Signatur

mcrypt_generic(resource $td, string $data): string

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

Typ
string
Beschreibung
Gibt den verschlüsselten Ciphertext als Binärstring zurück. Die Länge des Rückgabewerts ist immer ein Vielfaches der Blockgröße des verwendeten Algorithmus.

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
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().