/** * XOR two-way encryption/decryption, with a base64 wrapper. * * @package s2Member\Utilities * @since 3.5 * * @param str $base64 A string of data to decrypt. Should still be base64 encoded. * @param str $key Optional. Key used originally for encryption. Defaults to the one configured for s2Member. Short of that, defaults to: ``wp_salt()``. * @return str Decrypted string. */ public static function xdecrypt($base64 = FALSE, $key = FALSE) { $base64 = is_string($base64) ? $base64 : ""; $e = strlen($base64) ? c_ws_plugin__s2member_utils_strings::base64_url_safe_decode($base64) : ""; if (strlen($e) && preg_match("/^~xe(?:\\:([a-zA-Z0-9]+))?\\|(.*?)\$/s", $e, $md5_e)) { $key = c_ws_plugin__s2member_utils_encryption::key($key); if (strlen($md5_e[2]) && (!$md5_e[1] || $md5_e[1] === md5($md5_e[2]))) { for ($i = 1, $d = ""; $i <= strlen($md5_e[2]); $i++) { $char = substr($md5_e[2], $i - 1, 1); $keychar = substr($key, $i % strlen($key) - 1, 1); $d .= chr(ord($char) - ord($keychar)); } } if (isset($d) && is_string($d) && strlen($d)) { if (strlen($d = preg_replace("/^~xe\\|/", "", $d, 1, $xe)) && $xe) { $d = $d; } else { // Else we need to empty this out. $d = ""; } } return isset($d) && is_string($d) && strlen($d) ? $string = $d : ""; } else { // Otherwise we must fail here with an empty string value. return ""; } }
/** * XOR two-way encryption/decryption, with a base64 wrapper. * * @package s2Member\Utilities * @since 3.5 * * @param string $base64 A string of data to decrypt. Should still be base64 encoded. * @param string $key Optional. Key used originally for encryption. Defaults to the one configured for s2Member. Short of that, defaults to: ``wp_salt()``. * * @return string Decrypted string. */ public static function xdecrypt($base64 = '', $key = '') { $base64 = is_string($base64) ? $base64 : ''; $e = isset($base64[0]) ? c_ws_plugin__s2member_utils_strings::base64_url_safe_decode($base64) : ''; if (isset($e[0]) && preg_match('/^~xe(?:\\:([a-zA-Z0-9]+))?\\|(.*)$/s', $e, $md5_e)) { $key = c_ws_plugin__s2member_utils_encryption::key($key); if (isset($md5_e[2][0]) && (empty($md5_e[1]) || $md5_e[1] === md5($md5_e[2]))) { for ($i = 1, $d = ''; $i <= strlen($md5_e[2]); $i++) { $char = substr($md5_e[2], $i - 1, 1); $keychar = substr($key, $i % strlen($key) - 1, 1); $d .= chr(ord($char) - ord($keychar)); } } if (isset($d) && is_string($d) && isset($d[0])) { if (!strlen($d = preg_replace('/^~xe\\|/', '', $d, 1, $xe)) || !$xe) { $d = ''; } } // Force empty string; bad decryption. return isset($d) && is_string($d) && isset($d[0]) ? $string = $d : ''; // Default to empty string. } return ''; // Default to empty string. }