Start · Sprachen · PHP · Referenz · openssl_encrypt

openssl_encrypt

Funktion

Verschlüsselt einen String mit dem angegebenen Cipher-Algorithmus und gibt das verschlüsselte Ergebnis zurück.

seit PHP 5.3.0 Kategorie: crypto

Signatur

openssl_encrypt(string $data, string $cipher_algo, string $passphrase, int $options = 0, string $iv = "", string &$tag = null, string $aad = "", int $tag_length = 16): string|false

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

Typ
string|false
Beschreibung
Gibt bei Erfolg den verschlüsselten String zurück — Base64-codiert (Standard) oder als Rohbytes (mit 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
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
}
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 $passphrase wird nicht automatisch gehasht oder mit PBKDF2 abgeleitet — einen echten kryptografischen Schlüssel (z. B. via hash_hkdf() oder openssl_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 Fehlerfall false zurück; Rückgabewert stets mit === false prüfen.