PHP mcrypt_encrypt/mcrypt_decrypt issue, returns a

2019-06-22 12:12发布

问题:

I was looking for an answer but could not find it here. Please excuse me if this question was already asked.

I have a simple code encrypting and decrypting a string, strings look the same, but when comparing them using == they do not appear to be the same, so hashes are different as well..

Here is my code:

$oppa = "rompish";
$opp_enc = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, "key", $oppa, MCRYPT_MODE_ECB);
$opp_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, "key", $opp_enc, MCRYPT_MODE_ECB);

echo $oppa."<br />".$opp_dec."<br />";

if ($oppa == $opp_dec) echo "YAY"; else echo "NOPE";

On the page:

rompish rompish NOPE

Please tell me what I am doing wrong.

Thank you!

回答1:

AES always encrypts things in blocks of 16 bytes. Apparently mcrypt_encrypt pads the string out with zero bytes until it is a multiple of 16. mcrypt_decrypt dutifully decrypts this but lacks the information to remove the padding. And you are fooling yourself because the displayed values look the same even though oppa_dec actually ends with 9 zero bytes. Use a sensible padding scheme instead. – GregS

To remove these null characters, you can use the rtrim function. After running the decrypted output through that it should be equal.