openssl_decrypt

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

openssl_decryptDescritografa dados

Descrição

openssl_decrypt(
    string $data,
    string $cipher_algo,
    #[\SensitiveParameter] string $passphrase,
    int $options = 0,
    string $iv = "",
    ?string $tag = null,
    string $aad = ""
): string|false

Descriptografa uma string bruta ou codificada em base64 usando um determinado método e senha.

Parâmetros

data

A mensagem criptografada a ser descriptografada.

cipher_algo

O método de criptografia. Para obter uma lista de métodos de criptografia disponíveis, use openssl_get_cipher_methods().

passphrase

A senha. Se a senha for menor que o esperado, ela será preenchida silenciosamente com caracteres NUL; se a senha for maior que o esperado, ela será truncada silenciosamente.

Cuidado

Não há função de derivação de chave usada para passphrase como o próprio nome pode sugerir. A única operação utilizada é o preenchimento com caracteres NUL ou truncamento se o comprimento for diferente do esperado.

options

options pode ser uma das constantes OPENSSL_RAW_DATA, OPENSSL_ZERO_PADDING ou OPENSSL_DONT_ZERO_PAD_KEY.

iv

Um Vetor de Inicialização (IV) não-null. Se o IV for menor que o esperado, ele será preenchido com caracteres NUL e um alerta será emitido; se a senha for maior que o esperado, ela será truncada e um alerta será emitido.

tag

A etiqueta de autenticação no modo de criptografia AEAD. Se estiver incorreto, a autenticação falha e a função retorna false.

Cuidado

O comprimento da etiqueta tag não é verificado pela função. É responsabilidade do chamador garantir que o comprimento da etiqueta corresponda ao comprimento da etiqueta recuperada quando openssl_encrypt() for chamada. Caso contrário, a descriptografia poderá ser bem-sucedida se a etiqueta fornecida corresponder apenas ao início da etiqueta adequada.

aad

Dados autenticados adicionais.

Valor Retornado

A string descriptografada em caso de sucesso ou false em caso de falha.

Erros/Exceções

Emite um erro de nível E_WARNING se um algoritmo de criptografia desconhecido for passado através do parâmetro cipher_algo.

Emite um erro de nível E_WARNING se um valor vazio for passado através do parâmetro iv.

Registro de Alterações

Versão Descrição
8.1.0 tag agora pode ser nulo.
7.1.0 Os parâmetros tag e aad foram adicionados.

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 4 notes

up
13
Hernanibus
9 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
ittasks at gmail dot com
12 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 defaultfunction 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);
up
2
lucianonapoli at yahoo dot it
8 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 opensslopenssl AES-256-CBC -K 5ae1b8a17bad4da4fdac796f64c16ecd -iv 34857d973953e44afb49ea9d61104d8c -in doc.txt -out doc.enc.txtdecripting in php$key = hex2bin('5ae1b8a17bad4da4fdac796f64c16ecd');$iv = hex2bin('34857d973953e44afb49ea9d61104d8c');$output = openssl_decrypt($encstr, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
up
0
markagius dot co dot uk
8 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
To Top