Openssl decrypt: примеры (PHP)

Полное руководство по функции openssl_decrypt в PHP
Раздел: Шифрование (OpenSSL)
openssl_decrypt(string $data, string $cipher_algo, string $passphrase, int $options = 0, string $iv = "", string $tag = "", string $aad = ""): string|false

Функция openssl_decrypt в PHP

Функция openssl_decrypt() используется для расшифровки данных с использованием симметричных алгоритмов шифрования. Она применяется в случаях, когда требуется восстановить исходные данные, зашифрованные с помощью openssl_encrypt() или других совместимых инструментов.

Аргументы функции
  • $data - строка с зашифрованными данными (в бинарном или base64-формате).
  • $cipher_algo - алгоритм шифрования (например, 'aes-256-cbc', 'des-ede3').
  • $passphrase - ключ шифрования (парольная фраза).
  • $options - битовые флаги: OPENSSL_RAW_DATA, OPENSSL_ZERO_PADDING.
  • $iv - вектор инициализации (должен соответствовать использованному при шифровании).
  • $tag - тег аутентификации для AEAD-режимов (например, GCM).
  • $aad - дополнительные аутентификационные данные.

Примеры использования openssl_decrypt

Базовый пример с AES-256-CBC
$encrypted = base64_decode('MTIzNDU2Nzg5MDEyMzQ1Ng==');
$key = 'secretkey';
$iv = substr($encrypted, 0, 16);
$ciphertext = substr($encrypted, 16);
$decrypted = openssl_decrypt($ciphertext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
echo $decrypted;
Исходный текст
Использование с флагом OPENSSL_ZERO_PADDING
$encrypted = 'зашифрованная_строка';
$key = 'key';
$iv = '1234567890123456';
$decrypted = openssl_decrypt($encrypted, 'aes-128-cbc', $key, OPENSSL_ZERO_PADDING, $iv);
var_dump($decrypted);
string(16) "decrypted_text\x04\x04\x04\x04"

Похожие функции в PHP

В PHP существуют альтернативные функции для работы с шифрованием:

  • mcrypt_decrypt() - устаревшая функция из расширения mcrypt (удалена в PHP 7.2). Использование не рекомендуется.
  • sodium_crypto_secretbox_open() - функция из расширения libsodium для аутентифицированного шифрования. Предпочтительна для новых проектов.
  • hash_hmac() - используется для проверки целостности данных, но не для расшифровки.

Функция openssl_decrypt остается основным выбором для работы с унаследованными системами и распространенными алгоритмами.

Типичные ошибки

Неверный вектор инициализации
$encrypted = openssl_encrypt('data', 'aes-256-cbc', 'key', 0, 'iv1');
$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', 'key', 0, 'iv2');
var_dump($decrypted);
bool(false)
Неправильная кодировка данных
$encrypted = 'некорректные_данные';
$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', 'key');
var_dump($decrypted);
bool(false)
Отсутствие расширения OpenSSL
if (!extension_loaded('openssl')) {
    die('Расширение OpenSSL не загружено');
}

Изменения в последних версиях PHP

  • PHP 8.0: параметры $tag и $aad стали необязательными и могут передаваться в любом порядке при использовании именованных аргументов.
  • PHP 7.1: добавлена поддержка AEAD-режимов (GCM, CCM) через параметры $tag и $aad.
  • PHP 5.6.0: параметр $tag стал доступен для алгоритмов, использующих тег аутентификации.

Расширенные примеры

Работа с AEAD-режимом GCM
Пример php
$data = "Конфиденциальные данные";
$key = random_bytes(32);
$iv = random_bytes(12);
$cipher = 'aes-256-gcm';
$tag = '';

$encrypted = openssl_encrypt($data, $cipher, $key, 0, $iv, $tag);
$decrypted = openssl_decrypt($encrypted, $cipher, $key, 0, $iv, $tag);
echo $decrypted;
Конфиденциальные данные
Обработка различных форматов ввода
Пример php
$base64_encrypted = 'W14daX...=';
$binary_encrypted = base64_decode($base64_encrypted);
$key = 'password';
$iv = substr($binary_encrypted, 0, 16);
$ciphertext = substr($binary_encrypted, 16);

$decrypted = openssl_decrypt($ciphertext, 'aes-128-ofb', $key, OPENSSL_RAW_DATA, $iv);
Итеративная расшифровка потока
Пример php
function stream_decrypt($encrypted_chunks, $key, $iv) {
    $result = '';
    foreach ($encrypted_chunks as $chunk) {
        $result .= openssl_decrypt($chunk, 'aes-256-ctr', $key, OPENSSL_RAW_DATA, $iv);
    }
    return $result;
}

Аналоги в других языках

Python (cryptography)
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend

cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
decryptor = cipher.decryptor()
decrypted = decryptor.update(ciphertext) + decryptor.finalize()
JavaScript (Node.js Crypto)
const crypto = require('crypto');
const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
let decrypted = decipher.update(encrypted, 'base64', 'utf8');
decrypted += decipher.final('utf8');

Openssl decrypt в MySQL

SELECT AES_DECRYPT(encrypted_data, 'key') FROM table;

Отличия от PHP: в Python и JavaScript обычно требуется явное управление заполнением, а в MySQL шифрование привязано к СУБД.

PHP openssl_decrypt function comments

En
Openssl decrypt Decrypts data