static function ExtractDataPacket($data, $key, $options = array()) { $data = (string) $data; if (isset($options["key2"])) { $options2 = $options; if (isset($options["iv2"])) { $options["iv"] = $options["iv2"]; } else { unset($options["iv"]); } if (self::IsMcryptAvailable()) { $data = self::McryptDecrypt($data, $options["key2"], $options); } else { if (!isset($options["bits2"])) { $options["bits2"] = strlen($options["key2"]) * 8; } if ($options["mode"] == "CBC" && !isset($options["iv"])) { $options["iv"] = ""; } $bf = new Blowfish(); if ($options["mode"] == "CBC") { $bf->SetBlockMode("CBC"); $bf->SetInitVector($options["iv"]); } $bf->SetKey($options["key2"], $options["bits2"]); $bf->AddData($data); $bf->Finalize(); $data = $bf->Decrypt(); } $data = substr($data, 1) . substr($data, 0, 1); $options = $options2; } if (self::IsMcryptAvailable()) { $data = self::McryptDecrypt($data, $key, $options); } else { if (!isset($options["bits"])) { $options["bits"] = strlen($key) * 8; } if (!isset($options["mode"])) { $options["mode"] = "ECB"; } if ($options["mode"] == "CBC" && !isset($options["iv"])) { $options["iv"] = ""; } $bf = new Blowfish(); if ($options["mode"] == "CBC") { $bf->SetBlockMode("CBC"); $bf->SetInitVector($options["iv"]); } $bf->SetKey($key, $options["bits"]); $bf->AddData($data); $bf->Finalize(); $data = $bf->Decrypt(); } if ($data === false) { return false; } $pos = strpos($data, "\n"); if ($pos === false) { return false; } $data = substr($data, $pos + 1); $pos = strpos($data, "\n"); if ($pos === false) { return false; } $check = substr($data, 0, $pos); $data = substr($data, $pos + 1); $pos = strrpos($data, "\n"); if ($pos === false) { return false; } $data = substr($data, 0, $pos); if (!isset($options["lightweight"]) || !$options["lightweight"]) { if ($check !== strtolower(sha1($data))) { return false; } } else { if ($check !== strtolower(dechex(crc32($data)))) { return false; } } return $data; }