Search code examples
bashencryptionaesopensshencryption-asymmetric

Bash OpenSSL is not equal to php openssl_encrypt value


I am trying to reach the same value of encryption in bash as it is from php , with no success .

Here is my php script







$message ='{"coupon_key":"011205358365345679","location_id":"288","device_key":"test_1234"}';

$key = "password";

$iv = base64_decode("dU+AyWweQYhAlGKLaxoS9w==");




    $base64_iv = base64_encode($iv);
    
    $base64_ev = base64_encode($encrypted_value);
 


    $encrypted_value = openssl_encrypt(
        $message,
        'AES-256-CBC',
        $key,
        OPENSSL_RAW_DATA|OPENSSL_NO_PADDING,
        $iv
    );


    $encode = base64_encode($encrypted_value);

//Zi7UcBwqM+gKZC9iZPgF3UHBXLUg1+Age/1+kRIfcstYBgGfYm7N1qCIFnm6jGn4AGQph/Q6hKjR1hYBT0wkJv8c8qFrHHZNUuraMfSRH3s=

   
    $mac = hash_hmac('sha256', $base64_iv . $encode, $key);
    



    echo '{"iv":"'.$base64_iv.'","value":"'.$encode.'","mac":"'.$mac.'"}'."<br>";

    //{"iv":"dU+AyWweQYhAlGKLaxoS9w==","value":"Zi7UcBwqM+gKZC9iZPgF3UHBXLUg1+Age/1+kRIfcstYBgGfYm7N1qCIFnm6jGn4AGQph/Q6hKjR1hYBT0wkJv8c8qFrHHZNUuraMfSRH3s=","mac":"97fb6f4226a917322c7361af1d9b2949ad96691c1fc1a7f1c8379c71ae19f356"}
   
    $retString2 =  base64_encode('{"iv":"'.$base64_iv.'","value":"'.$encode.'","mac":"'.$mac.'"}');
    echo $retString2;
    //eyJpdiI6ImRVK0F5V3dlUVloQWxHS0xheG9TOXc9PSIsInZhbHVlIjoiWmk3VWNCd3FNK2dLWkM5aVpQZ0YzVUhCWExVZzErQWdlLzEra1JJZmNzdFlCZ0dmWW03TjFxQ0lGbm02akduNEFHUXBoL1E2aEtqUjFoWUJUMHdrSnY4YzhxRnJISFpOVXVyYU1mU1JIM3M9IiwibWFjIjoiOTdmYjZmNDIyNmE5MTczMjJjNzM2MWFmMWQ5YjI5NDlhZDk2NjkxYzFmYzFhN2YxYzgzNzljNzFhZTE5ZjM1NiJ9


and here is my bash version

password="password";
passwordhex=$(echo "$password" | xxd  -c 256 -ps) ;

# iv2=$(hexdump -n 16 -e '4/4 "%08X" 1 "\n"' /dev/random) ;

iv=$(printf  'dU+AyWweQYhAlGKLaxoS9w==' | base64 -d )



biv=$(printf "$iv" | base64) ;
hexiv=$(printf  "$iv" | xxd  -c 256 -ps) ;
eString=$(printf '{"coupon_key":"011205358365345678","location_id":"288","device_key":"test_1234"}');
tttw=$(printf "$eString" | openssl aes-256-cbc -e   -nosalt -a -A -K   "$passwordhex"  -iv "$hexiv") ;
echo "$tttw" ;

printf "${biv}${tttw}" |openssl dgst -sha256 -hmac abc -macopt hexkey:"$passwordhex" | sed 's/^.* //';

macopt2=$(printf "${biv}${tttw}" |openssl dgst -sha256 -hmac abc -macopt hexkey:"$passwordhex" | sed 's/^.* //');

echo "$macopt2"

finalString="{'iv':'$biv','value':'$tttw','mac':'$macopt2'}";
echo "$finalString";
sendHash=$(printf "$finalString" | base64 -w 0)
echo "$sendHash"


Starting from tttw=$(echo -n $eString | openssl aes-256-cbc -e -nosalt -a -A -K $passwordhex -iv $hexiv) ;

it goes wrong , because $tttw is returning then

bKG5quB9/YQUsmlFvDHq2H+AfNGQuDfVztyi0dd5hCY7hLfaACnjD8SWlwqy0yy4hXUZSA2YcTXej/xtMg9vqEpoO6CDw9hk7+tUcYOOV5aOdVBnSLowmEllHt0JfjdE instead of Zi7UcBwqM+gKZC9iZPgF3UHBXLUg1+Age/1+kRIfcstYBgGfYm7N1qCIFnm6jGn4AGQph/Q6hKjR1hYBT0wkJv8c8qFrHHZNUuraMfSRH3s=

Can anybody maybe see what option is going wrong here?

Note1: I have updated the bash script to use prinf instead of echo -n

Note 2 : Seems on my newer machine I get "hex string is too short, padding with zero bytes to length" from the line

 tttw=$(printf $eString | openssl aes-256-cbc -e   -nosalt -a -A -K   $passwordhex  -iv $hexiv) ;


Solution

  • Looks like the issue is near the very top:

    passwordhex=$(echo "$password" | xxd  -c 256 -ps) ;
    

    So essentially the output of echo "$password" is password\n.

    Using echo like this will append a line feed to the input for xxd which I assume you already know since the original script was packed with echo -n. I mentioned in the comments that printf is more portable. The accepted way to use printf with a variable is like this:

    passwordhex=$(printf '%s' "$password" | xxd  -c 256 -ps) ;
    

    The reason for this is that if your variable has a format identifier (like %s), it would change the output unexpectedly. This would have also showed up on shellcheck.

    With this one change, here is the output:

    Zi7UcBwqM+gKZC9iZPgF3UHBXLUg1+Age/1+kRIfcssepjJ8+wUjTDAjPUMkGA+eF9EL284iD5UIzA+REyhMWLWbUJpPltHFk1+lhQyVlUXXVTw0FFV1G+iQfEWhbyg4
    484123c33b54e446c61120112955cd15f3592f42e737c9fa24db266cdec954a2
    484123c33b54e446c61120112955cd15f3592f42e737c9fa24db266cdec954a2
    {'iv':'dU+AyWweQYhAlGKLaxoS9w==','value':'Zi7UcBwqM+gKZC9iZPgF3UHBXLUg1+Age/1+kRIfcssepjJ8+wUjTDAjPUMkGA+eF9EL284iD5UIzA+REyhMWLWbUJpPltHFk1+lhQyVlUXXVTw0FFV1G+iQfEWhbyg4','mac':'484123c33b54e446c61120112955cd15f3592f42e737c9fa24db266cdec954a2'}
    eydpdic6J2RVK0F5V3dlUVloQWxHS0xheG9TOXc9PScsJ3ZhbHVlJzonWmk3VWNCd3FNK2dLWkM5aVpQZ0YzVUhCWExVZzErQWdlLzEra1JJZmNzc2Vwako4K3dValREQWpQVU1rR0ErZUY5RUwyODRpRDVVSXpBK1JFeWhNV0xXYlVKcFBsdEhGazErbGhReVZsVVhYVlR3MEZGVjFHK2lRZkVXaGJ5ZzQnLCdtYWMnOic0ODQxMjNjMzNiNTRlNDQ2YzYxMTIwMTEyOTU1Y2QxNWYzNTkyZjQyZTczN2M5ZmEyNGRiMjY2Y2RlYzk1NGEyJ30=