加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

如何解密以PHP中的NUL字符结尾的二进制数据?

发布时间:2020-12-13 17:22:53 所属栏目:PHP教程 来源:网络整理
导读:例: $data = "Test Datax00x00";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,$encrypted,MCR
例:

$data = "Test Datax00x00";
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,$encrypted,MCRYPT_MODE_ECB);
echo strlen($decrypted);

$newData = rtrim($decrypted,"x00");
echo strlen($newData);

输出:

11
16
16
9  <-- I want 11 here

那么,有没有办法解密在加密之前可能已经为空填充的数据,并获得正确的长度数据?

解决方法

这种情况正在发生,因为在加密时,数据需要是一定的大小.您的数据小于此数据,因此需要填充. PHP使用NULL字符填充数据,所以当你rtrim时,你要删除你的NULL和PHP添加的那些.

一种解决方案是使用另一种方法将数据填充到正确的长度.我个人使用PKCS7 padding.

以下是如何使用此填充方法的示例(改编自https://gist.github.com/1077723):

$data = "Test Datax00x00";

$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,MCRYPT_MODE_ECB);

$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_ECB);

// PKCS7 Padding
$strPad = ord($decrypted[strlen($decrypted)-1]);
$newData = substr($decrypted,-$strPad);

DEMO:http://ideone.com/bMZxyf

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读