Openssl encrypt: примеры (PHP)
openssl_encrypt(string $data, string $cipher_algo, string $passphrase, int $options = 0, string $iv = "", string &$tag = null, string $aad = "", int $tag_length = 16): string|falseФункция openssl_encrypt применяется в PHP для симметричного шифрования данных. Ее используют, когда необходимо защитить информацию, передаваемую или хранимую в системе, например, конфиденциальные пользовательские данные, токены или содержимое файлов.
Синтаксис: string openssl_encrypt(string $data, string $method, string $key, int $options = 0, string $iv = '', string &$tag = null, string $aad = '', int $tag_length = 16)
Аргументы:
- $data – текст для шифрования.
- $method – алгоритм (например, 'aes-128-cbc', 'aes-256-gcm').
- $key – секретный ключ шифрования.
- $options – флаги: OPENSSL_RAW_DATA (вернуть сырые байты), OPENSSL_ZERO_PADDING.
- $iv – вектор инициализации для CBC, CFB, OFB, GCM режимов.
- &$tag – тег аутентификации (для GCM режима).
- $aad – дополнительные аутентифицированные данные (GCM).
- $tag_length – длина тега (4-16 байт для GCM).
$data = 'Секретное сообщение';
$method = 'aes-256-cbc';
$key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(16);
$encrypted = openssl_encrypt($data, $method, $key, 0, $iv);
echo $encrypted;Результат (base64): NzUwYzA2Yj... (зависит от ключа и IV)
$encryptedRaw = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);
echo base64_encode($encryptedRaw);Вывод: другой base64 из-за отсутствия авто-кодирования.
$method = 'aes-256-gcm';
$iv = openssl_random_pseudo_bytes(12);
$tag = null;
$encrypted = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv, $tag, '', 16);
echo 'Шифр: ' . base64_encode($encrypted) . '\nТег: ' . base64_encode($tag);Шифр: MDEyMzQ1Njc4...\nТег: wV4fX5LzQbE=
openssl_decrypt – обратная операция для расшифровки. Всегда используется в паре.
sodium_crypto_secretbox – часть расширения Libsodium, предлагает современные алгоритмы (например, XChaCha20-Poly1305). Рекомендуется для новых проектов.
hash_hmac – создает HMAC для проверки целостности, но не шифрует данные.
mcrypt_encrypt – устаревшая функция, удалена в PHP 7.2. Не следует использовать.
Выбор: openssl_encrypt подходит для взаимодействия с системами, использующими OpenSSL. Для более высокой безопасности и простоты предпочтительнее Libsodium.
$key = 'короткий_ключ';
$encrypted = openssl_encrypt('тест', 'aes-256-cbc', $key);
var_dump($encrypted);bool(false) и Warning: openssl_encrypt(): Key length is too short
$encrypted = openssl_encrypt('тест', 'aes-256-ecb', $key, 0, 'лишний_iv');
var_dump($encrypted);bool(false) и Warning: openssl_encrypt(): IV passed is 17 bytes long which is longer than the 0 expected by selected cipher
$encrypted = openssl_encrypt('тест', 'aes-256-gcm', $key, 0, $iv);
var_dump($encrypted);bool(false) и Warning: openssl_encrypt(): Setting of IV length for AEAD mode failed
В PHP 8.0 функция стала выбрасывать исключение Error в случае неудачи вместо возврата false и генерации предупреждений (E_WARNING).
// PHP 8+
try {
$encrypted = openssl_encrypt('data', 'unknown-cipher', 'key');
} catch (\Error $e) {
echo 'Ошибка: ' . $e->getMessage();
}Ошибка: openssl_encrypt(): Unknown cipher algorithm
Добавлена поддержка алгоритма ChaCha20-Poly1305 ('chacha20-poly1305') в PHP 7.4+.
В PHP 8.1 улучшены сообщения об ошибках для неверных параметров.
$data = 'Платеж: 1000 руб.';
$aad = 'номер_счета_12345';
$tag = null;
$encrypted = openssl_encrypt($data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag, $aad);
// При расшифровке тот же AAD обязателен
$decrypted = openssl_decrypt($encrypted, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag, $aad);
echo $decrypted;Платеж: 1000 руб.
$data = '1234567890123456'; // 16 байт, ровно для блока
$encrypted = openssl_encrypt($data, 'aes-128-ecb', $key, OPENSSL_ZERO_PADDING);
echo $encrypted;Base64 строка. Без дополнения PKCS7, данные должны быть выровнены.
// Генерация сессионного ключа и шифрование им данных
$sessionKey = openssl_random_pseudo_bytes(32);
$encryptedData = openssl_encrypt($data, 'aes-256-cbc', $sessionKey, OPENSSL_RAW_DATA, $iv);
// Шифрование сессионного ключа RSA публичным ключом
$publicKey = openssl_pkey_get_public('file://public.pem');
openssl_public_encrypt($sessionKey, $encryptedSessionKey, $publicKey);
// Отправка $encryptedData, $iv и $encryptedSessionKeyПолучатель расшифрует сессионный ключ своим приватным ключом RSA, затем им - данные.
// PHP: использование PKCS7 дополнения (по умолчанию) и CBC
$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);
// Для .NET: Convert.FromBase64String(encrypted), ключ и IV те же.Данные успешно расшифровываются на стороне C#.
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
import os
key = os.urandom(32)
iv = os.urandom(16)
cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
encryptor = cipher.encryptor()
padder = padding.PKCS7(128).padder()
data = b'Secret message'
padded_data = padder.update(data) + padder.finalize()
ciphertext = encryptor.update(padded_data) + encryptor.finalize()
print(ciphertext.hex())Вывод: 1a2b3c4d5e6f... (шестнадцатеричная строка)
async function encryptAes(data, key, iv) {
const cryptoKey = await crypto.subtle.importKey('raw', key, 'AES-CBC', false, ['encrypt']);
const encrypted = await crypto.subtle.encrypt({ name: 'AES-CBC', iv }, cryptoKey, new TextEncoder().encode(data));
return new Uint8Array(encrypted);
}Возвращает объект Uint8Array с байтами шифротекста.
Openssl encrypt в MySQL
SELECT TO_BASE64(AES_ENCRYPT('Secret message', 'my32charactergeneratekey123456'))Результат: base64 строка зашифрованных данных.
Отличия: В Python и JS чаще используется объектно-ориентированный подход. Web Crypto API асинхронный. MySQL встраивает шифрование прямо в запросы.