PHP 8.6.0 Beta 1 is available for testing

openssl_decrypt

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

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

Описание

function openssl_decrypt(
string $data,
string $cipher_algo,
#[\SensitiveParameter]string $passphrase,
int $options = 0,
string $iv = "",
? string $tag = null ,
string $aad = ""
): 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. Если он некорректен, то аутентификация завершится неудачей и функция вернёт false .

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

Длина tag не проверяется функцией. Вызывающая сторона несёт ответственность за то, чтобы длина тега соответствовала длине тега, полученного при вызове openssl_encrypt() . В противном случае дешифрование может быть успешным, если данный тег совпадает только с началом правильного тега.

aad

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

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

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

Ошибки

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

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

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

Версия Описание
8.1.0 Параметр tag теперь принимает значение null.
7.1.0 Добавили параметры tag и aad.

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

Нашли ошибку?

ИнструкцияИсправлениеСообщение об ошибке
+Добавить

Примечания пользователей 4 notes

up
26
Hernanibus
10 years ago
Parameters may seem obvius to some but not for everyone so:
- $data can be as the description says raw or base64. If no $option is set (this is, if value of 0 is passed in this parameter), data will be assumed to be base64 encoded. If parameter OPENSSL_RAW_DATA is set, it will be understood as row data.
- $password (key) is a String of [pseudo] bytes as those generated by the function openssl_random_pseudo_bytes().
- $options as (as for 2016) two possible values OPENSSL_RAW_DATA and OPENSSL_ZERO_PADDING. Setting both can be done by OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING. If no OPENSSL_ZERO_PADDING is specify, default pading of PKCS#7 will be done as it's been observe by [openssl at mailismagic dot com]'s coment in openssl_encrypt()
- $iv is as in the case of $password, a String of bytes. Its length depends on the algorithm used. May be the best way to generate an $iv is by:
<?php
 $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('your algorithm'));// for example you algorithm = 'AES-256-CTR'
?>
up
4
lucianonapoli at yahoo dot it
9 years ago
The parameter string $password must be in binary form and is derived from the exadecimal key value.
Example:
encrypting in command line console with openssl
openssl AES-256-CBC -K 5ae1b8a17bad4da4fdac796f64c16ecd -iv 34857d973953e44afb49ea9d61104d8c -in doc.txt -out doc.enc.txt
decripting in php
$key = hex2bin('5ae1b8a17bad4da4fdac796f64c16ecd');
$iv = hex2bin('34857d973953e44afb49ea9d61104d8c');
$output = openssl_decrypt($encstr, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
up
2
markagius dot co dot uk
9 years ago
openssl_decrypt(..) works with most but not all method types.
This list can vary, depending on the data (Message) and key (Password) used.
See the following code and edit the $text and $password values.
Code checks if text is the same after encrypting then decrypting it.
Note:
 You can still use openssl_encrypt(..) with;
 User enters 'Log-in password'
 (Encrypted and stored using openssl_encrypt)
 Next time.
 User logs-in with 'Log-in password'
 (Check that encrypted 'Log-in password' = stored data)
<CODE>
 // Please edit $password=... and $text=...
 $password = "This is a journey into sound";
 $text = "";
 for($charNo=0; $charNo<=255; $charNo=$charNo+1){
 // if($charNo==127) {$charNo=$charNo+1;}
 if(!$charNo<127){
 // $text = $text."&#x".strtoupper(dechex($charNo)).";";
 $text = $text.chr($charNo);
 } else {
 $text = $text.chr($charNo);
 }
 }
$text = "This is a test message.";
 print "<TABLE BORDER=\"1\">\n";
 print "<TR><TD><B>Encryption type:</B></TD><TD><B>String after converting back:</B></TD></TR>\n";
 $ciphers = openssl_get_cipher_methods();
 for($pointer=0; $pointer<count($ciphers); $pointer=$pointer+1){
 $edit = EncryptDecrypt($text, true, $password, $ciphers[$pointer]);
 $check = EncryptDecrypt($edit, false, $password, $ciphers[$pointer]);
 if($text!=$check){
 $info = $check;
 print "<TR><TD>".$ciphers[$pointer]."</TD><TD>".$info."</TD></TR>\n";
 }
 }
 print "</TABLE>\n";
function EncryptDecrypt($oldText, $encryptIt=true, $password="PASSWORD", $encryptType=""){
 $ciphers = openssl_get_cipher_methods();
 $foundEncType = false;
 for($pointer=0; $pointer<count($ciphers); $pointer=$pointer+1){
 if($ciphers[$pointer]==$encryptType){$foundEncType=true;}
 }
 if(!$foundEncType){
 $encryptType = "RC2-64-CBC"; // Default value used if not set or listed.
 }
 if($encryptIt){
 $newText = openssl_encrypt($oldText,$encryptType,$password);
 } else {
 $newText = openssl_decrypt($oldText,$encryptType,$password);
 }
 return $newText;
}
</CODE>
The following (sometimes) don't work:
 DES-EDE3-CFB1 (sometimes)
 aes-128-gcm
 aes-192-gcm
 aes-256-gcm
 des-ede3-cfb1 (sometimes)
 id-aes128-GCM
 id-aes192-GCM
 id-aes256-GCM
up
3
ittasks at gmail dot com
13 years ago
in case that hosting do not provide openssl_encrypt decrypt functions - it could be mimiced via commad prompt executions 
this functions will check is if openssl is installed and try to use it by default
function sslPrm()
{
 return array("your_password","IV (optional)","aes-128-cbc");
}
function sslEnc($msg)
{
 list ($pass, $iv, $method)=sslPrm();
 if(function_exists('openssl_encrypt'))
 return urlencode(openssl_encrypt(urlencode($msg), $method, $pass, false, $iv));
 else
 return urlencode(exec("echo \"".urlencode($msg)."\" | openssl enc -".urlencode($method)." -base64 -nosalt -K ".bin2hex($pass)." -iv ".bin2hex($iv)));
}
function sslDec($msg)
{
 list ($pass, $iv, $method)=sslPrm();
 if(function_exists('openssl_decrypt'))
 return trim(urldecode(openssl_decrypt(urldecode($msg), $method, $pass, false, $iv)));
 else
 return trim(urldecode(exec("echo \"".urldecode($msg)."\" | openssl enc -".$method." -d -base64 -nosalt -K ".bin2hex($pass)." -iv ".bin2hex($iv))));
}
//example of usage:
$r= sslEnc("This is encryption/decryption test!");
echo "<br>\n".$r.":".sslDec($r);
+Добавить

AltStyle によって変換されたページ (->オリジナル) /