openssl_encrypt

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

openssl_encryptVerschlüsselt Daten

Beschreibung

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

Verschlüsselt die Daten mit der angegebenen Methode und der angegebenen Passphrase. Die Rückgabe kann aus einer unbearbeiteten oder base64-kodierten Zeichenkette bestehen.

Parameter-Liste

data

Die zu verschlüsselnde Klartextnachricht.

cipher_algo

Die Verschlüsselungsmethode. openssl_get_cipher_methods() liefert eine Liste der verfügbaren Verschlüsselungsmethoden.

passphrase

Die Passphrase. Ist die Passphrase kürzer als erwartet, wird sie stillschweigend mit NUL-Zeichen aufgefüllt; ist die Passphrase länger als erwartet, wird sie stillschweigend abgeschnitten.

Achtung

Für passphrase wird keine Funktion zur Ableitung eines Schlüssels verwendet, wie der Name vielleicht vermuten lässt. Die einzige Operation, die verwendet wird, ist das Auffüllen mit NUL-Zeichen oder das Abschneiden, wenn die Länge anders ist als erwartet.

options

options ist eine bitweise Verknüpfung der Flags OPENSSL_RAW_DATA und OPENSSL_ZERO_PADDING oder OPENSSL_DONT_ZERO_PAD_KEY.

iv

Der Initialisierungsvektor (darf nicht null sein). Ist der IV kürzer als erwartet, wird er mit NUL-Zeichen aufgefüllt und eine Warnung ausgegeben; ist die Passphrase länger als erwartet, wird sie abgeschnitten und eine Warnung ausgegeben.

tag

Das Authentifizierungskennzeichen das per Referenz übergeben wird, wenn der AEAD-Verschlüsselungsmodus (GCM oder CCM) verwendet wird.

aad

Zusätzliche authentifizierte Daten.

tag_length

Die Länge des Authentifizierungskennzeichens tag. Der Wert liegt beim GCM-Modus zwischen 4 und 16.

Rückgabewerte

Gibt nach erfolgreicher Verarbeitung die verschlüsselte Zeichenkette zurück. Bei einem Fehler wird false zurückgegeben.

Fehler/Exceptions

Gibt einen Fehler der Stufe E_WARNING aus, wenn eine unbekannte Verschlüsselungsmethode über den Parameter cipher_algo übergeben wurde.

Gibt einen Fehler der Stufe E_WARNING aus, wenn eine leere Zeichenkette über den Parameter iv übergeben wurde.

Changelog

Version Beschreibung
7.1.0 Die Parameter tag, aad und tag_length wurden hinzugefügt.

Beispiele

Beispiel #1 AES Authenticated Encryption im GCM-Modus, Beispiel für PHP 7.1+

<?php
// $key sollte zuvor auf eine kryptographisch sichere Weise erzeugt worden
// sein, z. B. per openssl_random_pseudo_bytes
$plaintext = "zu verschlüsselnde Nachricht";
$cipher = "aes-128-gcm";
if (
in_array($cipher, openssl_get_cipher_methods()))
{
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
// speichere $cipher, $iv und $tag für spätere Entschlüsselung
$original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
echo
$original_plaintext."\n";
}
?>

Beispiel #2 AES Authenticated Encryption, Beispiel vor PHP 7.1

<?php
// $key sollte zuvor auf eine kryptographisch sichere Weise erzeugt worden
// sein, z. B. per openssl_random_pseudo_bytes
$plaintext = "zu verschlüsselnde Nachricht";
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );

// spätere Entschlüsselung ...
$c = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen+$sha2len);
$original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
if (
hash_equals($hmac, $calcmac)) // Rechenzeitangriff-sicherer Vergleich
{
echo
$original_plaintext."\n";
}
?>

Siehe auch