Openssl private decrypt: примеры (PHP)
openssl_private_decrypt(string $data, string &$decrypted_data, OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key, int $padding = OPENSSL_PKCS1_PADDING): boolОписание функции openssl_private_decrypt
Функция openssl_private_decrypt применяется для расшифровки данных, которые ранее были зашифрованы с использованием открытого ключа (асимметричное шифрование). Основной сценарий использования — обработка информации, зашифрованной на клиентской стороне или другой системой, обладающей только публичным ключом.
Функция принимает четыре параметра:
- $data (string) — строка с зашифрованными данными для расшифровки.
- &$decrypted (string) — переменная, передаваемая по ссылке, в которую будет помещён результат расшифровки.
- $private_key (mixed) — закрытый ключ. Может быть строкой в формате PEM, ресурсом типа OpenSSL key или объектом OpenSSLAsymmetricKey/OpenSSLCertificate (начиная с PHP 8.0).
- $padding (int) — опциональный аргумент, определяющий режим дополнения (padding). Возможные значения: OPENSSL_PKCS1_PADDING (по умолчанию), OPENSSL_PKCS1_OAEP_PADDING, OPENSSL_SSLV23_PADDING, OPENSSL_NO_PADDING.
Примеры использования openssl_private_decrypt
Использование с ключом в формате PEM и стандартным заполнением:
$privateKey = openssl_pkey_get_private('file://path/to/private.pem');
$encryptedData = base64_decode('... зашифрованная строка в base64 ...');
$success = openssl_private_decrypt($encryptedData, $decrypted, $privateKey);
if ($success) {
echo $decrypted;
}Расшифрованный текст
Использование более безопасного метода заполнения OAEP:
$success = openssl_private_decrypt(
$encryptedData,
$decrypted,
$privateKey,
OPENSSL_PKCS1_OAEP_PADDING
);Данные, расшифрованные с OAEP
Случай, когда функция возвращает false из-за ошибки:
$result = openssl_private_decrypt('invalid_data', $decrypted, $privateKey);
var_dump($result); // falsebool(false)
Похожие функции в PHP
Функция для шифрования данных открытым ключом. Применяется в паре с openssl_private_decrypt.
Обратная операция — расшифровка данных закрытым ключом после шифрования открытым.
Шифрование с использованием закрытого ключа. Используется для создания цифровых подписей.
Библиотека Sodium предоставляет современные криптографические примитивы. Функции crypto_box_seal_open и crypto_box_seal являются асимметричными аналогами. Рекомендуется для новых проектов из-за более простого API и устойчивости к типичным ошибкам.
Распространённые ошибки
Использование ключа в неправильном формате или повреждённого ключа:
$wrongKey = 'not a valid key';
$result = openssl_private_decrypt($data, $decrypted, $wrongKey);
if ($result === false) {
echo openssl_error_string();
}error:0909006C:PEM routines:get_name:no start line
Использование другого padding при расшифровке, отличного от применённого при шифровании:
// Зашифровано с OPENSSL_PKCS1_OAEP_PADDING
// Попытка расшифровать с OPENSSL_PKCS1_PADDING (по умолчанию)
openssl_private_decrypt($data, $decrypted, $key); // Вернёт falsebool(false)
Попытка расшифровать данные, размер которых превышает возможности ключа:
// Ключ RSA 2048 бит может шифровать блоки до 245 байт (с PKCS1_PADDING)
$largeData = random_bytes(300);
// ... шифрование и попытка расшифровки ...Функция может завершиться неудачей или вернуть мусор
Изменения в новых версиях PHP
Тип параметра $private_key был расширен. Теперь, помимо строки и ресурса, функция принимает объекты классов OpenSSLAsymmetricKey и OpenSSLCertificate. Устаревший ресурсный тип (resource) был заменён на эти объекты.
Было добавлено предупреждение при использовании устаревшего ресурса вместо объекта. Рекомендуется использовать функции openssl_pkey_get_private для получения корректного объекта ключа.
Расширенные примеры применения
Сценарий, где данные шифруются на стороне браузера с помощью JS библиотеки (например, forge) и расшифровываются на сервере.
// PHP серверная часть
$encryptedBase64 = $_POST['encrypted_data'];
$encrypted = base64_decode($encryptedBase64);
$privateKey = openssl_pkey_get_private('file://private.pem');
$success = openssl_private_decrypt(
$encrypted,
$decrypted,
$privateKey,
OPENSSL_PKCS1_OAEP_PADDING
);
// $decrypted содержит данные, отправленные клиентом$privateKey = openssl_pkey_get_private(
'file://private_protected.pem',
'strong_password'
);
// Далее стандартная расшифровкаРасшифровка данных, которые после шифрования были сериализованы или упакованы.
openssl_private_decrypt($encrypted, $serialized, $privateKey);
$data = unserialize($serialized); // Восстановление массива или объектаПример, когда большие данные разбиты на блоки и зашифрованы по отдельности.
$fullDecrypted = '';
foreach ($encryptedChunks as $chunk) {
openssl_private_decrypt($chunk, $decryptedChunk, $privateKey);
$fullDecrypted .= $decryptedChunk;
}Расшифрованные данные могут быть сразу записаны в файл или переданы дальше.
if (openssl_private_decrypt($encrypted, $decrypted, $privateKey)) {
file_put_contents('decrypted.txt', $decrypted);
}Аналоги в других языках программирования
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding
with open("private.pem", "rb") as key_file:
private_key = serialization.load_pem_private_key(
key_file.read(),
password=None
)
decrypted = private_key.decrypt(
ciphertext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)b'decrypted data'
Node.js пример с crypto.privateDecrypt:
const crypto = require('crypto');
const privateKey = crypto.createPrivateKey(fs.readFileSync('private.pem'));
const decrypted = crypto.privateDecrypt(
{
key: privateKey,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
},
Buffer.from(encryptedData, 'base64')
);Openssl private decrypt в MySQL
Прямого аналога асимметричного расшифрования закрытым ключом нет. MySQL предлагает функции для симметричного шифрования (AES_DECRYPT).
PHP openssl_private_decrypt function comments
- Php openssl private decrypt - аргументы и возвращаемое значение
- Функция php openssl_private_decrypt - описание
- openssl private decrypt - примеры
- openssl private decrypt - похожие методы на php
- openssl_private_decrypt на js, python, mysql
- openssl private decrypt изменения php
- Примеры openssl_private_decrypt на php