我在网上找到了以下解密功能。我发现的其他解密函数是这个函数的变种:
public function Decrypt($data) {
$crypt = base64_decode($data);
$iv_size = mcrypt_get_iv_size($this->Algo, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$decrypt = mcrypt_decrypt($this->Algo, $this->Key, $crypt, MCRYPT_MODE_ECB, $iv);
$block = mcrypt_get_block_size('blowfish', 'ecb');
$pad = ord($decrypt[($len = strlen($decrypt)) - 1]);
return substr($decrypt, 0, strlen($decrypt) - $pad);
}
我的问题如下:ord()函数给出了一个字符的ASCII值。然后,此ASCII值用于涉及字符串长度的计算中。为什么会这样? (在我看来,填充的ASCII值不应与字符串长度一起使用。)
答案 0 :(得分:1)
某些操作模式(如CBC和ECB)用于分组密码需要填充,因为密码仅针对完整块进行定义。因此填充用于填充明文直到下一个块边界。它还用于在每个字节对应填充长度的同时对填充的长度进行编码,ord()
返回此“char”的整数。这种双重使用将得到的密文大小减少了一个块(其中将保留填充或明文的大小)。
显示的填充方案对应PKCS#5/PKCS#7。
答案 1 :(得分:1)
填充由ASCII字符组成,其中添加的字符数量与填充值相同。
Ord用于确定该数字并删除填充。
更多信息:http://lukieb.blogspot.nl/2013/04/making-aes256-encryption-work-same-in.html