openssl_encrypt

(PHP 5 >= 5.3.0, PHP 7)

openssl_encrypt — Verschlüsselt Daten

Beschreibung

openssl_encrypt ( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string &$tag = NULL [, string $aad = "" [, int $tag_length = 16 ]]]]] ) : string

Verschlüsselt die Daten mit der angegebenen Methode und Schlüssel. Die Rückgabe kann aus unbearbeiteten oder base64 kodierten Zeichenketten bestehen.

Parameter-Liste

data

Die zu verschlüsselnde Klartextnachricht.

method

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

key

Der Schlüssel.

options

options ist eine Bitmaske aus OPENSSL_RAW_DATA und OPENSSL_ZERO_PADDING.

iv

Initialisierungsvektor (darf nicht NULL sein).

tag

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

aad

Zusätzliche Authentifizierungsdaten.

tag_length

Die Länge des Authentifizierungskennzeichens (tag). Der Wert liegt zwischen 4 und 16 für den GCM-Modus.

Rückgabewerte

Gibt nach erfolgreicher Verarbeitung die verschlüsselte Zeichenkette zurück. Im Fehlerfall wird FALSE zurückgegeben.

Fehler/Exceptions

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

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

Changelog

Version Beschreibung
7.1.0 Die tag, aad und tag_length Parameter wurden hinzugefügt.
5.3.3 Der iv wurde hinzugefügt.
5.4.0 Der raw_output wurde geändert zu options.

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 für PHP 5.6+

<?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)) // PHP 5.6+ Rechenzeitangriff-sicherer Vergleich
{
    echo 
$original_plaintext."\n";
}
?>

Siehe auch