ket-c
ket-c

Reputation: 221

Why AES can't Decrypt , PHP. Openssl

I'm having problem with decrypting I have

 $key="Gwu078980";
 $cipher="aes-128-gcm";
 $iv=md5($cipher);
 $text="yaw0";
 $tag="";
 echo $encrypted=openssl_encrypt($text, $cipher, $key, 0, $iv, $tag);

 echo $de_ciphertext=openssl_decrypt($encrypted, $cipher, $key, 0, $iv, $tag);

Output

ELRmWQ==
yaw0

So the raw text is yaw0 and the encrypted is ELRmWQ== and the decrypted is yaw0 so perfect.

But when I manually copy the encrypted text and use it as

$encrypted ="ELRmWQ==";

And I run the decryption the decryption returns null. Thanks in advance for anyone to help me out.

Upvotes: 0

Views: 620

Answers (1)

Kep
Kep

Reputation: 5857

Your openssl_encrypt message modifies $tag by reference since you're using aes-128-gcm.

That parameter is required for openssl_decrypt aswell (when using AEAD - Authenticated Encryption and Decryption) and is probably an empty string in your case when you omit the openssl_encrypt call.

See Example 1 in the docs:

The comment about storing $cipher, $iv, and $tag is the important part:

<?php
//$key should have been previously generated in a cryptographically safe way, like openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$cipher = "aes-128-gcm";
if (in_array($cipher, openssl_get_cipher_methods()))
{
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
    //store $cipher, $iv, and $tag for decryption later
    $original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
    echo $original_plaintext."\n";
}
?>

Upvotes: 1

Related Questions