作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
例子:
$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);
输出:
11
16
16
9 <-- I want 11 here
那么,有什么方法可以解密在加密之前可能已经被空填充的数据,并得到正确长度的数据吗?
最佳答案
发生这种情况是因为在加密时,数据需要有一定的大小。你的数据比那个小,所以它被填充了。 PHP 用 NULL 字符填充数据,因此当您rtrim
时,您将删除 您的 NULL 和用 PHP 添加的 NULL。
一种解决方案是使用另一种方法将数据填充到正确的长度。我个人使用PKCS7 padding .
这是一个如何使用此填充方法的示例(改编自 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);
关于php - 如何在 PHP 中解密以 NUL 字符结尾的二进制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14345642/
我是一名优秀的程序员,十分优秀!