public function decrypt($text, $key = null)
{
if ($key === null) {
$key = $this->_key;
}
$ivSize = mcrypt_enc_get_block_size($this->_mcrypt);
if (strlen($text) < $ivSize * 3) {
throw new CryptException('encrypted data is too short.');
}
$encryptKey = md5($key, true);
mcrypt_generic_init($this->_mcrypt, $encryptKey, substr($text, 0, $ivSize));
$decrypted = mdecrypt_generic($this->_mcrypt, substr($text, $ivSize));
$length = unpack('N', $decrypted)[1];
if ($length < 16 || 4 + $length > strlen($decrypted)) {
throw new CryptException('decrypted data length is too short.');
}
$decrypted = substr($decrypted, 4, $length);
$plainText = substr($decrypted, 0, -16);
if (md5($plainText, true) !== substr($decrypted, -16)) {
throw new CryptException('decrypted md5 is not valid.');
}
return $plainText;
}