var Xxtea = { xxtea_encrypt : function(str, key) { if (str == "") { return ""; } var v = this.str2long(str, true); var k = this.str2long(key, false); if (str === undefined || str === null || str.length === 0) { return str; } var n = v.length - 1; var z = v[n], y = v[0], delta = 0x9E3779B9; var mx, e, q = Math.floor(6 + 52 / (n + 1)), sum = 0; while (q-- > 0) { sum = (sum + delta) & 0xffffffff; e = sum >> 2 & 3; for (var p = 0; p < n; p++) { y = v[p + 1]; mx = ((z >> 5 & 0x07ffffff) ^ y << 2) + ((y >> 3 & 0x1fffffff) ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z); z = v[p] = (v[p] + mx) & 0xffffffff; } y = v[0]; mx = ((z >> 5 & 0x07ffffff) ^ y << 2) + ((y >>> 3 & 0x1fffffff) ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z); z = v[n] = (v[n] + mx) & 0xffffffff; } return this.long2str(v, false); }, xxtea_decrypt : function (str, key) { if (str == "") { return ""; } var v = this.str2long(str, false); var k = this.str2long(key, false); var n = v.length - 1; var y = v[0], delta = 0x9E3779B9; var mx, e, q = Math.floor(6 + 52 / (n + 1)), sum = (q * delta) & 0xffffffff; while (sum != 0) { e = sum >> 2 & 3; for (var p = n; p > 0; p--) { z = v[p - 1]; mx = ((z >> 5 & 0x07ffffff) ^ y << 2) + ((y >> 3 & 0x1fffffff) ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z); y = v[p] = (v[p] - mx) & 0xffffffff; } z = v[n]; mx = ((z >> 5 & 0x07ffffff) ^ y << 2) + ((y >> 3 & 0x1fffffff) ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z); y = v[0] = (v[0] - mx) & 0xffffffff; sum = (sum - delta) & 0xffffffff; } return this.long2str(v, false); }, long2str : function(v, w) { var vl = v.length; var sl = vl << 2; if (w) { m = v[vl - 1]; sl -= 4; if ((m < sl - 3) || (m > sl)) return false; sl = m; } for (var i = 0; i < vl; i++) { v[i] = String.fromCharCode(v[i] & 0xff, v[i] >>> 8 & 0xff, v[i] >>> 16 & 0xff, v[i] >>> 24 & 0xff); } if (w) { return v.join('').substring(0, sl); } else { return v.join(''); } }, str2long : function (s, w) { var len = s.length; var v = []; for (var i = 0; i < len; i += 4) { v[i >> 2] = s.charCodeAt(i) | s.charCodeAt(i + 1) << 8 | s.charCodeAt(i + 2) << 16 | s.charCodeAt(i + 3) << 24; } if (w) { v[v.length] = len; } return v; } };