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