Start · Sprachen · PHP · Referenz · mcrypt_module_is_block_mode

mcrypt_module_is_block_mode

Funktion

Prüft, ob ein gegebener Verschlüsselungsmodus blockweise Ausgabe erzeugt (z. B. <code>cbc</code>, <code>ecb</code>) und gibt <code>true</code> zurück, wenn dies der Fall ist.

seit PHP 4.0.2 Kategorie: crypto

Signatur

mcrypt_module_is_block_mode(string $mode, string $lib_dir = ''): bool

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

Typ
bool
Beschreibung
Gibt 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";
}
?>
'cbc' ist ein Block-Modus – Padding wird benötigt. 'cfb' ist ein Stream-Modus – kein Padding nötig.

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.