Signatur
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
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;
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;
}
// 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-GCMgegenüberAES-256-CBC, da sie Manipulation der Daten erkennen. - Nutze
$options = OPENSSL_RAW_DATAfür binäre Daten und handle Base64-Kodierung manuell, um Klarheit über das Datenformat zu behalten. - Der Rückgabewert
falsesollte immer mit=== falsegeprü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 überhash_pbkdf2()oderopenssl_pbkdf2()ab. - Der Algorithmusname ist case-insensitiv, aber Konsistenz in der Schreibweise verbessert die Lesbarkeit.