Start · Sprachen · PHP · Referenz · mcrypt_enc_is_block_mode

mcrypt_enc_is_block_mode

Funktion

Prüft, ob der geöffnete Verschlüsselungsmodus blockweise Ausgabe erzeugt (z. B. CBC, ECB) oder nicht (z. B. CFB, OFB).

seit PHP 4.0.2 Kategorie: crypto

Signatur

mcrypt_enc_is_block_mode(resource $td): bool

Beschreibung

mcrypt_enc_is_block_mode() ermittelt, ob der aktuell geöffnete Verschlüsselungsmodus eine blockweise Ausgabe produziert. Block-Modi wie CBC oder ECB geben immer vollständige Blöcke zurück, während Stream-Modi wie CFB oder OFB byteweise arbeiten und daher false liefern.

Die Funktion wird typischerweise nach dem Öffnen eines Verschlüsselungs-Deskriptors mit mcrypt_module_open() aufgerufen, um das Verhalten des Modus dynamisch zu ermitteln – beispielsweise um zu entscheiden, ob ein Padding-Algorithmus angewendet werden muss.

Das Wissen, ob ein Modus blockweise arbeitet, ist besonders wichtig beim Verschlüsseln von Daten beliebiger Länge: Bei Block-Modi muss die Eingabe auf ein Vielfaches der Blockgröße aufgefüllt werden, bei Stream-Modi entfällt dieser Schritt.

Achtung: Die gesamte mcrypt-Erweiterung ist seit PHP 7.1.0 als veraltet markiert und wurde in PHP 7.2.0 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 Der Verschlüsselungs-Deskriptor, der zuvor mit mcrypt_module_open() geöffnet wurde.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der geöffnete Modus blockweise Ausgabe erzeugt (z. B. CBC, ECB), und false, wenn er byteweise/stream-artig arbeitet (z. B. CFB, OFB).

Beispiele

Modus auf blockweise Ausgabe prüfen (CBC vs. CFB)

<?php
// CBC-Modus prüfen (Block-Modus)
$td_cbc = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
if (mcrypt_enc_is_block_mode($td_cbc)) {
    echo "CBC erzeugt blockweise Ausgabe — Padding erforderlich.\n";
} else {
    echo "CBC ist ein Stream-Modus.\n";
}
mcrypt_module_close($td_cbc);

// CFB-Modus prüfen (Stream-Modus)
$td_cfb = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CFB, '');
if (mcrypt_enc_is_block_mode($td_cfb)) {
    echo "CFB erzeugt blockweise Ausgabe.\n";
} else {
    echo "CFB ist ein Stream-Modus — kein Padding nötig.\n";
}
mcrypt_module_close($td_cfb);
CBC erzeugt blockweise Ausgabe — Padding erforderlich. CFB ist ein Stream-Modus — kein Padding nötig.

Dynamisches Padding bei Block-Modus anwenden

<?php
$cipher  = MCRYPT_RIJNDAEL_128;
$mode    = MCRYPT_MODE_CBC;
$key     = str_pad('geheimschluessel', 16, '\0');
$iv_size = mcrypt_get_iv_size($cipher, $mode);
$iv      = mcrypt_create_iv($iv_size, MCRYPT_RAND);

$td = mcrypt_module_open($cipher, '', $mode, '');

$plaintext = 'Hallo Welt!';

if (mcrypt_enc_is_block_mode($td)) {
    // Padding auf Blockgröße auffüllen
    $block_size = mcrypt_enc_get_block_size($td);
    $pad_length = $block_size - (strlen($plaintext) % $block_size);
    $plaintext .= str_repeat(chr($pad_length), $pad_length);
    echo "Padding wurde angewendet, Länge nach Padding: " . strlen($plaintext) . " Bytes\n";
}

mcrypt_generic_init($td, $key, $iv);
$ciphertext = mcrypt_generic($td, $plaintext);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

echo "Verschlüsselt (hex): " . bin2hex($ciphertext) . "\n";
Padding wurde angewendet, Länge nach Padding: 16 Bytes Verschlüsselt (hex): ...

// Wichtig · Fallstricke

Deprecation: Die mcrypt-Erweiterung wurde in PHP 7.1.0 als veraltet markiert (deprecated) und in PHP 7.2.0 vollständig entfernt. Diese Funktion steht in modernen PHP-Versionen nicht mehr zur Verfügung.

Für neue Projekte oder bei der Migration bestehender Anwendungen sollte openssl_encrypt() / openssl_decrypt() oder die libsodium-Erweiterung (sodium_crypto_secretbox() u. a.) verwendet werden, die deutlich sicherer und aktiv gepflegt sind.

Bei Block-Modi ist korrektes Padding essenziell: Fehlendes oder falsches Padding kann zu Padding-Oracle-Angriffen führen. Verwende daher immer authentifizierte Verschlüsselung (z. B. AES-GCM via OpenSSL), die Integrität und Vertraulichkeit kombiniert.