openssl_encrypt

(PHP 5 >= 5.3.0, PHP 7)

openssl_encryptVerschlü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.4.0 Der raw_output wurde geändert zu options.
5.3.3 Der iv wurde 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($cipheropenssl_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($c0$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