Signatur
Beschreibung
openssl_encrypt() verschlüsselt die übergebenen Daten ($data) mit einem OpenSSL-Verschlüsselungsalgorithmus (z. B. AES-256-CBC oder AES-256-GCM). Das Ergebnis kann wahlweise als Base64-codierter String oder als Rohbinärdaten zurückgegeben werden. Die Funktion nutzt die OpenSSL-Bibliothek des Systems und unterstützt eine Vielzahl von Algorithmen, die per openssl_get_cipher_methods() abgefragt werden können.
Der Parameter $options steuert das Verhalten: OPENSSL_RAW_DATA liefert Rohbytes statt Base64, OPENSSL_ZERO_PADDING deaktiviert das automatische Padding. Beide Konstanten können per bitweisem OR kombiniert werden. Ohne OPENSSL_RAW_DATA wird das Ergebnis automatisch Base64-kodiert, was für die Übertragung als Text geeignet ist.
Für authentifizierte Verschlüsselung (AEAD) sollten Algorithmen wie AES-256-GCM oder AES-256-CCM verwendet werden. In diesem Fall wird über den by-reference-Parameter $tag ein Authentifizierungstag zurückgegeben, der beim Entschlüsseln mit openssl_decrypt() angegeben werden muss. Zusätzliche Authentifizierungsdaten (AAD) können über $aad übergeben werden.
Der Initialisierungsvektor ($iv) muss für jeden Verschlüsselungsvorgang zufällig und einmalig sein — niemals denselben IV zweimal mit demselben Schlüssel verwenden. Die erwartete Länge des IV kann mit openssl_cipher_iv_length() ermittelt werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $data Pflicht | string | Der Klartext, der verschlüsselt werden soll. | |
| $cipher_algo Pflicht | string | Name des Verschlüsselungsalgorithmus, z. B. AES-256-CBC oder AES-256-GCM. Verfügbare Algorithmen liefert openssl_get_cipher_methods(). |
|
| $passphrase Pflicht | string | Der Schlüssel (Passphrase/Key), der zur Verschlüsselung verwendet wird. Bei Algorithmen wie AES-256 wird ein 32 Byte langer Schlüssel erwartet; ist die Passphrase kürzer, wird sie intern aufgefüllt. | |
| $options | int | 0 | Bitkombination aus OPENSSL_RAW_DATA (Rohbytes statt Base64) und OPENSSL_ZERO_PADDING (kein automatisches Padding). Standard: 0 (Base64-Ausgabe mit PKCS#7-Padding). |
| $iv | string | "" | Initialisierungsvektor (IV) — sollte für jeden Verschlüsselungsvorgang per random_bytes() neu erzeugt werden. Die korrekte Länge liefert openssl_cipher_iv_length(). |
| $tag | string | null | By-reference-Parameter: Bei AEAD-Algorithmen (GCM, CCM) wird hier der Authentifizierungstag abgelegt, der beim Entschlüsseln benötigt wird. |
| $aad | string | "" | Zusätzliche Authentifizierungsdaten (Additional Authenticated Data) für AEAD-Modi — werden in den Tag eingerechnet, aber nicht verschlüsselt. |
| $tag_length | int | 16 | Gewünschte Länge des Authentifizierungstags in Bytes (nur für AEAD-Modi relevant). Für GCM: 4–16 Bytes. |
Rückgabewert
OPENSSL_RAW_DATA). Im Fehlerfall wird false zurückgegeben.Beispiele
Einfache AES-256-CBC-Verschlüsselung
<?php
$algorithmus = 'AES-256-CBC';
$schluessel = random_bytes(32); // 256-Bit-Schlüssel
$iv = random_bytes(openssl_cipher_iv_length($algorithmus));
$klartext = 'Geheime Nachricht';
$verschluesselt = openssl_encrypt($klartext, $algorithmus, $schluessel, OPENSSL_RAW_DATA, $iv);
// IV und Chiffretext gemeinsam speichern/übertragen
$gespeichert = base64_encode($iv . $verschluesselt);
echo $gespeichert;
// Entschlüsselung
$rohdaten = base64_decode($gespeichert);
$ivLen = openssl_cipher_iv_length($algorithmus);
$ivWieder = substr($rohdaten, 0, $ivLen);
$chiffretext = substr($rohdaten, $ivLen);
$entschluesselt = openssl_decrypt($chiffretext, $algorithmus, $schluessel, OPENSSL_RAW_DATA, $ivWieder);
echo $entschluesselt; // Geheime Nachricht
Authentifizierte Verschlüsselung mit AES-256-GCM
<?php
$algorithmus = 'AES-256-GCM';
$schluessel = random_bytes(32);
$iv = random_bytes(openssl_cipher_iv_length($algorithmus));
$aad = 'optionale-authentifizierungsdaten';
$tag = '';
$klartext = 'Vertrauliche Daten';
$verschluesselt = openssl_encrypt(
$klartext,
$algorithmus,
$schluessel,
OPENSSL_RAW_DATA,
$iv,
$tag,
$aad,
16
);
echo 'Verschlüsselt (Base64): ' . base64_encode($verschluesselt) . PHP_EOL;
echo 'Tag (Hex): ' . bin2hex($tag) . PHP_EOL;
// Entschlüsselung + Integritätsprüfung
$entschluesselt = openssl_decrypt(
$verschluesselt,
$algorithmus,
$schluessel,
OPENSSL_RAW_DATA,
$iv,
$tag,
$aad
);
if ($entschluesselt === false) {
echo 'Authentifizierung fehlgeschlagen!';
} else {
echo $entschluesselt; // Vertrauliche Daten
}
// Wichtig · Fallstricke
Sicherheitshinweise:
- Den IV niemals wiederverwenden — für jede Verschlüsselung einen neuen zufälligen IV mit
random_bytes()erzeugen. - Den IV zusammen mit dem Chiffretext speichern; er ist nicht geheim, muss aber einmalig sein.
- Bevorzuge AEAD-Algorithmen (
AES-256-GCM) gegenüber reinen Cipher-Modi wie CBC, da sie Integrität und Authentizität der Daten sicherstellen. - Der Parameter
$passphrasewird nicht automatisch gehasht oder mit PBKDF2 abgeleitet — einen echten kryptografischen Schlüssel (z. B. viahash_hkdf()oderopenssl_pbkdf2()) ableiten, wenn eine menschenlesbare Passphrase eingegeben wird. - Ist die übergebene Passphrase kürzer als der Algorithmus erwartet, füllt OpenSSL sie mit Null-Bytes auf — das ist unsicher. Immer Schlüssel der richtigen Länge verwenden.
openssl_encrypt()gibt im Fehlerfallfalsezurück; Rückgabewert stets mit=== falseprüfen.