Start · Sprachen · PHP · Referenz · openssl_decrypt

openssl_decrypt

Funktion

Entschlüsselt verschlüsselte Daten mit dem angegebenen Algorithmus und Schlüssel.

seit PHP 5.3.0 Kategorie: crypto

Signatur

openssl_decrypt(string $data, string $cipher_algo, string $passphrase, int $options = 0, string $iv = "", string $tag = "", string $aad = ""): string|false

Beschreibung

openssl_decrypt() entschlüsselt einen verschlüsselten Datenpuffer mithilfe eines symmetrischen Algorithmus (z. B. AES-256-CBC, AES-256-GCM) und des passenden Schlüssels sowie Initialisierungsvektors. Die Funktion ist das Gegenstück zu openssl_encrypt() und erwartet dieselben Parameter, die bei der Verschlüsselung verwendet wurden.

Der Parameter $options steuert, ob der Eingabepuffer base64-kodiert ist (0, Standard) oder roh binär übergeben wird (OPENSSL_RAW_DATA). Mit OPENSSL_ZERO_PADDING wird das automatische Auffüllen deaktiviert. Die Flags können per bitweisem ODER kombiniert werden.

Bei authentifizierten Verschlüsselungsverfahren wie AES-256-GCM oder AES-256-CCM muss zusätzlich der Authentifizierungs-Tag ($tag) übergeben werden, der bei der Verschlüsselung erzeugt wurde. Schlägt die Tag-Überprüfung fehl, gibt die Funktion false zurück — die Integrität und Authentizität der Daten können so sichergestellt werden.

Der Schlüssel ($passphrase) sollte ein kryptografisch starker Zufallsschlüssel geeigneter Länge für den gewählten Algorithmus sein (z. B. 32 Byte für AES-256). Für passwortbasierte Verschlüsselung empfiehlt sich die Ableitung über hash_pbkdf2() oder openssl_pbkdf2().

Parameter

Name Typ Default Beschreibung
$data Pflicht string Die zu entschlüsselnden Daten. Standardmäßig wird base64-Eingabe erwartet, außer OPENSSL_RAW_DATA ist gesetzt.
$cipher_algo Pflicht string Der Verschlüsselungsalgorithmus, z. B. 'AES-256-CBC' oder 'AES-256-GCM'. Verfügbare Algorithmen liefert openssl_get_cipher_methods().
$passphrase Pflicht string Der Entschlüsselungsschlüssel. Muss mit dem bei der Verschlüsselung verwendeten Schlüssel übereinstimmen.
$options int 0 Optionen als Kombination von OPENSSL_RAW_DATA (binäre Ein-/Ausgabe) und OPENSSL_ZERO_PADDING (kein automatisches Padding). Standard (0) bedeutet base64-kodierte Eingabe mit automatischem Padding.
$iv string "" Der Initialisierungsvektor (IV), der bei der Verschlüsselung verwendet wurde. Für die meisten Modi (CBC, GCM) zwingend erforderlich. Die korrekte Länge liefert openssl_cipher_iv_length().
$tag string "" Authentifizierungs-Tag für AEAD-Verfahren (GCM, CCM). Stimmt der Tag nicht überein, gibt die Funktion false zurück.
$aad string "" Zusätzliche authentifizierte Daten (Additional Authenticated Data) für AEAD-Modi. Muss mit den AAD bei der Verschlüsselung übereinstimmen.

Rückgabewert

Typ
string|false
Beschreibung
Gibt die entschlüsselten Klartextdaten als String zurück. Bei einem Fehler (falscher Schlüssel, ungültiger Algorithmus, fehlgeschlagene Tag-Überprüfung bei AEAD) wird false zurückgegeben.

Beispiele

AES-256-CBC: Ver- und Entschlüsseln

<?php
$algo      = 'AES-256-CBC';
$key       = random_bytes(32);                          // 256-Bit-Schlüssel
$ivLength  = openssl_cipher_iv_length($algo);
$iv        = random_bytes($ivLength);

$plaintext  = 'Geheime Nachricht';
$encrypted  = openssl_encrypt($plaintext, $algo, $key, OPENSSL_RAW_DATA, $iv);

// Verschlüsselten Block + IV speichern/übertragen
$bundle = base64_encode($iv . $encrypted);
echo 'Verschlüsselt (Base64): ' . $bundle . PHP_EOL;

// Entschlüsseln
$decoded   = base64_decode($bundle);
$ivOut     = substr($decoded, 0, $ivLength);
$cipherOut = substr($decoded, $ivLength);

$decrypted = openssl_decrypt($cipherOut, $algo, $key, OPENSSL_RAW_DATA, $ivOut);
echo 'Entschlüsselt: ' . $decrypted . PHP_EOL;
Verschlüsselt (Base64): <base64-String> Entschlüsselt: Geheime Nachricht

AES-256-GCM mit Authentifizierungs-Tag

<?php
$algo     = 'AES-256-GCM';
$key      = random_bytes(32);
$ivLength = openssl_cipher_iv_length($algo);  // typischerweise 12 Byte
$iv       = random_bytes($ivLength);
$aad      = 'Zusätzlicher Kontext';            // nicht verschlüsselt, aber authentifiziert
$tag      = '';

$plaintext = 'Vertrauliche Daten';
$encrypted = openssl_encrypt(
    $plaintext, $algo, $key,
    OPENSSL_RAW_DATA, $iv, $tag, $aad, 16
);

echo 'Tag (hex): ' . bin2hex($tag) . PHP_EOL;

// Entschlüsseln mit Tag-Prüfung
$decrypted = openssl_decrypt(
    $encrypted, $algo, $key,
    OPENSSL_RAW_DATA, $iv, $tag, $aad
);

if ($decrypted === false) {
    echo 'Entschlüsselung fehlgeschlagen oder Integrität verletzt!' . PHP_EOL;
} else {
    echo 'Entschlüsselt: ' . $decrypted . PHP_EOL;
}
Tag (hex): <32 hex-Zeichen> Entschlüsselt: Vertrauliche Daten

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Verwende niemals denselben IV zweimal mit demselben Schlüssel. Erzeuge den IV stets mit random_bytes().
  • Bevorzuge authentifizierte Verfahren wie AES-256-GCM gegenüber AES-256-CBC, da sie Manipulation der Daten erkennen.
  • Nutze $options = OPENSSL_RAW_DATA für binäre Daten und handle Base64-Kodierung manuell, um Klarheit über das Datenformat zu behalten.
  • Der Rückgabewert false sollte immer mit === false geprüft werden, da ein leerer String ('') ein gültiges Entschlüsselungsergebnis sein kann.
  • Für passwortbasierte Schlüssel niemals das Passwort direkt als $passphrase übergeben — leite es vorher über hash_pbkdf2() oder openssl_pbkdf2() ab.
  • Der Algorithmusname ist case-insensitiv, aber Konsistenz in der Schreibweise verbessert die Lesbarkeit.