Шифрует данные

# openssl_encrypt

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

openssl_encrypt — Шифрует данные

### Описание

function 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

Функция шифрует данные с заданным шифром и кодовой фразой и возвращает необработанную строку, либо строку, закодированную в base64.

### Список параметров

`data`

  Данные для шифрования.

`cipher_algo`

  Метод шифрования. Список доступных методов можно получить с помощью функции openssl_get_cipher_methods().

`passphrase`

  Кодовая фраза. Если кодовая фраза укорочена, чем ожидалось, она автоматически дополняется символами `NUL`; если кодовая фраза длиннее, чем ожидалось, она автоматически усекается.

  Предостережение

  Для параметра `passphrase` не используется функция извлечения ключа, как можно предположить из его названия. Единственная операция, которая используется, – это заполнение символами `NUL` или усечение, если длина отличается от ожидаемой.

`options`

  `options` можно задать одной из констант: `OPENSSL_RAW_DATA`, `OPENSSL_ZERO_PADDING` или `OPENSSL_DONT_ZERO_PAD_KEY`.

`iv`

  Ненулевой (non-`null`) инициализирующий вектор. Если IV короче, чем ожидалось, он заполняется символами `NUL` и выдаётся предупреждение; если кодовая фраза длиннее, чем ожидалось, он усекается и выдаётся предупреждение.

`tag`

  Тег аутентификации, передаваемый по ссылке, в режиме шифрования AEAD (GCM или CCM).

`aad`

  Дополнительные аутентифицированные данные.

`tag_length`

  Длина параметра `tag`. Для режима GCM должно быть от 4 до 16.

### Возвращаемые значения

Функция возвращает зашифрованную строку или `false`, если возникла ошибка.

### Ошибки

Функция выдаёт ошибку уровня `E_WARNING`, если в параметр `cipher_algo` передали неизвестный алгоритм шифрования.

Функция выдаёт ошибку уровня `E_WARNING`, если в параметр `iv` передали пустое значение.

### Список изменений

Версия | Описание
--- | ---
7.1.0 | Добавили параметры `tag`, `aad` и `tag_length`.

### Примеры

Пример #1 Пример шифрования AES с аутентификацией в режиме GCM в PHP 7.1+

    <?php

    // $key должен быть сгенерирован заранее криптографически безопасным образом,
    // например, функцией openssl_random_pseudo_bytes
    $plaintext = "данные для шифрования";
    $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);

        // Сохраняем $cipher, $iv и $tag для дальнейшей расшифровки
        $original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
        echo $original_plaintext."\n";
    }

    ?>

Пример #2 Пример шифрования AES с аутентификацией до PHP 7.1

    <?php

    // $key должен быть сгенерирован заранее криптографически безопасным образом,
    // например, функцией openssl_random_pseudo_bytes
    $plaintext = "данные для шифрования";
    $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 );

    // Расшифровка....
    $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)) // Сравнение, которое не подвержено атаке по времени
    {
        echo $original_plaintext."\n";
    }

    ?>

### Смотрите также

- openssl_decrypt() - Расшифровывает данные

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open