(PHP 5 >= 5.3.0, PHP 7, PHP 8)
openssl_encrypt — Verschlüsselt Daten
$data
,$cipher_algo
,$passphrase
,$options
= 0,$iv
= "",&$tag
= null
,$aad
= "",$tag_length
= 16Verschlüsselt die Daten mit der angegebenen Methode und der angegebenen Passphrase. Die Rückgabe kann aus einer unbearbeiteten oder base64-kodierten Zeichenkette bestehen.
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.
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.
Gibt nach erfolgreicher Verarbeitung die verschlüsselte Zeichenkette
zurück. Bei einem Fehler wird false
zurückgegeben.
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.
Version | Beschreibung |
---|---|
7.1.0 |
Die Parameter tag , aad
und tag_length wurden hinzugefügt.
|
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";
}
?>