Signatur
Beschreibung
mcrypt_module_is_block_mode() gibt an, ob der angegebene Betriebsmodus Daten in Blöcken verarbeitet und ausgibt. Block-Modi wie CBC (Cipher Block Chaining) oder ECB (Electronic Codebook) arbeiten mit festen Blöcken einer bestimmten Länge, während Stream-Modi wie CFB oder OFB byteweise Ausgabe erzeugen.
Diese Funktion ist nützlich, wenn man zur Laufzeit dynamisch entscheiden möchte, ob Padding erforderlich ist – denn bei Block-Modi muss die Eingabelänge ein Vielfaches der Blockgröße sein, während Stream-Modi keine solche Einschränkung kennen.
Der optionale Parameter lib_dir erlaubt die Angabe eines Verzeichnisses, in dem mcrypt nach Modul-Bibliotheken sucht. Wird er weggelassen, wird das systemweite Standardverzeichnis verwendet.
Wichtiger Hinweis: Die gesamte mcrypt-Erweiterung gilt seit PHP 7.1 als veraltet und wurde in PHP 7.2 vollständig entfernt. Für neue Projekte sollte stattdessen die openssl- oder sodium-Erweiterung verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mode Pflicht | string | Der Name des zu prüfenden Betriebsmodus, z. B. 'cbc', 'ecb', 'cfb', 'ofb' oder 'stream'. |
|
| $lib_dir | string | Optionaler Pfad zum Verzeichnis, in dem die mcrypt-Modul-Bibliotheken gesucht werden. Wird dieser weggelassen, wird das systemweite Standardverzeichnis verwendet. |
Rückgabewert
true zurück, wenn der angegebene Modus blockweise Ausgabe erzeugt (z. B. cbc, ecb), andernfalls false (bei Stream-Modi wie cfb, ofb).Beispiele
Prüfung verschiedener Modi auf blockweise Ausgabe
<?php
// Prüfen, ob CBC ein Block-Modus ist
$mode = 'cbc';
if (mcrypt_module_is_block_mode($mode)) {
echo "'{$mode}' ist ein Block-Modus – Padding wird benötigt.\n";
} else {
echo "'{$mode}' ist ein Stream-Modus – kein Padding nötig.\n";
}
// Prüfen, ob CFB ein Block-Modus ist
$mode = 'cfb';
if (mcrypt_module_is_block_mode($mode)) {
echo "'{$mode}' ist ein Block-Modus – Padding wird benötigt.\n";
} else {
echo "'{$mode}' ist ein Stream-Modus – kein Padding nötig.\n";
}
?>
Dynamisches Padding abhängig vom Modus
<?php
function encrypt_data(string $data, string $key, string $cipher, string $mode): string {
$iv = mcrypt_create_iv(
mcrypt_get_iv_size($cipher, $mode),
MCRYPT_RAND
);
// Nur bei Block-Modi muss die Datenlänge aufgefüllt werden
if (mcrypt_module_is_block_mode($mode)) {
$blockSize = mcrypt_get_block_size($cipher, $mode);
$pad = $blockSize - (strlen($data) % $blockSize);
$data .= str_repeat(chr($pad), $pad); // PKCS#7-Padding
}
return mcrypt_encrypt($cipher, $key, $data, $mode, $iv);
}
// Beispielaufruf (nur zu Demonstrationszwecken, mcrypt ist veraltet!)
$key = str_pad('geheimschluessel', 16, '\0');
$verschluesselt = encrypt_data('Hallo Welt', $key, MCRYPT_RIJNDAEL_128, 'cbc');
echo base64_encode($verschluesselt);
?>
// Wichtig · Fallstricke
Deprecation und Entfernung: Die mcrypt-Erweiterung wurde in PHP 7.1 als veraltet markiert und in PHP 7.2 vollständig entfernt. mcrypt_module_is_block_mode() steht in modernen PHP-Versionen nicht mehr zur Verfügung. Bestehender Code sollte dringend auf openssl_encrypt() / openssl_decrypt() oder die sodium-Erweiterung migriert werden.
Für die Bestimmung, ob Padding notwendig ist, reicht in modernen Implementierungen die Kenntnis des verwendeten Modus: GCM, CTR, CFB und OFB benötigen kein Padding; CBC und ECB hingegen schon. ECB sollte aufgrund gravierender Sicherheitsschwächen (keine semantische Sicherheit) grundsätzlich vermieden werden.