例:
$data = "Test Data\x00\x00";
echo strlen($data);
$key = "mykey";
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, MD5($key, true), $data, MCRYPT_MODE_ECB);
echo strlen($encrypted);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, MD5($key, true), $encrypted, MCRYPT_MODE_ECB);
echo strlen($decrypted);
$newData = rtrim($decrypted,"\x00");
echo strlen($newData);
Run Code Online (Sandbox Code Playgroud)
输出:
11
16
16
9 <-- I want 11 here
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法解密在加密之前可能已经为空填充的数据,并获得正确的长度数据?
这种情况正在发生,因为在加密时,数据需要是一定的大小.您的数据小于此数据,因此需要填充.PHP垫用NULL字符的数据,所以当你rtrim,你删除这两个你的空值,并与PHP加入的影片.
一种解决方案是使用另一种方法将数据填充到正确的长度.我个人使用PKCS7填充.
以下是如何使用此填充方法的示例(改编自https://gist.github.com/1077723):
$data = "Test Data\x00\x00";
$key = "mykey";
$blocksize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
// PKCS7 Padding
$pad = $blocksize - (strlen($data) % $blocksize);
$data .= str_repeat(chr($pad), $pad);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, MD5($key, true), $data, MCRYPT_MODE_ECB);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, MD5($key, true), $encrypted, MCRYPT_MODE_ECB);
// PKCS7 Padding
$strPad = ord($decrypted[strlen($decrypted)-1]);
$newData = substr($decrypted, 0, -$strPad);
Run Code Online (Sandbox Code Playgroud)