js xxtea 支持中文
该方法服务器收到的是这样的字符串 8b54dd9bf2603e0cfunction xxtea_encrypt(str, key) {if (str == "") {return "";}var v = str2long(str, true);var k = str2long(key, false);if (typeof str === 'string') str = toBytes(str);if (typeof key === 'string') key = toBytes(key);if (str === undefined || str === null || str.length === 0) {return str;}var v= toUint32Array(str, true);var k = toUint32Array(key, false);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 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);z = v[p] = v[p] + mx & 0xffffffff;}y = v[0];mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);z = v[n] = v[n] + mx & 0xffffffff;}return str2Hex(long2str(v, false));}function xxtea_decrypt(str, key) {if (str == "") {return "";}str = hex2str(str);var v = str2long(str, false);var k = str2long(key, false);var n = v.length - 1;var z = v[n - 1], 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 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);y = v[p] = v[p] - mx & 0xffffffff;}z = v[n];mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);y = v[0] = v[0] - mx & 0xffffffff;sum = sum - delta & 0xffffffff;}var test= toUint8Array(v, true);return toString(test);}function long2str(v, w) {var vl = v.length;var sl = v[vl - 1] & 0xffffffff;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('');}}function str2long(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;}function str2Hex(input) {var output = ""; var chr1 = ""; var i = 0;do { chr1 = input.charCodeAt(i++).toString(16); if(chr1.length==1) {chr1="0"+chr1;}output+=chr1;} while (i < input.length);return output; }function hex2str(input) {var output="";var i=0;while(i<input.length){var k = parseInt(input.substr(i,1),16)<<4 | parseInt(input.substr(++i,1),16);k=k&255;output+=String.fromCharCode(k);++i;}return output;}function toUint32Array(bytes, includeLength) {var length = bytes.length;var n = length >> 2;if ((length & 3) !== 0) {++n;}var v;if (includeLength) {v = new Array(n + 1);v[n] = length;}else {v = new Uint32Array(n);}for (var i = 0; i < length; ++i) {v[i >> 2] |= bytes[i] << ((i & 3) << 3);}return v;}function toUint8Array(v, includeLength) {var n;if (includeLength) {n = v[v.length - 1];} else {n = v.length << 2;}var result = new Uint8Array(n);for (var i = 0; i < n; i++) {result[i] = v[i >> 2] >> ((i & 3) << 3);}return result;}function toBytes(str) {var n = str.length;var bytes = new Uint8Array(n * 3);var length = 0;for (var i = 0; i < n; i++) {var codeUnit = str.charCodeAt(i);if (codeUnit < 0x80) {bytes[length++] = codeUnit;}else if (codeUnit < 0x800) {bytes[length++] = 0xC0 | (codeUnit >> 6);bytes[length++] = 0x80 | (codeUnit & 0x3F);}else if (codeUnit < 0xD800 || codeUnit > 0xDFFF) {bytes[length++] = 0xE0 | (codeUnit >> 12);bytes[length++] = 0x80 | ((codeUnit >> 6) & 0x3F);bytes[length++] = 0x80 | (codeUnit & 0x3F);}else {if (i + 1 < n) {var nextCodeUnit = str.charCodeAt(i + 1);if (codeUnit < 0xDC00 && 0xDC00 <= nextCodeUnit && nextCodeUnit <= 0xDFFF) {var rune = (((codeUnit & 0x03FF) << 10) | (nextCodeUnit & 0x03FF)) + 0x010000;bytes[length++] = 0xF0 | (rune >> 18);bytes[length++] = 0x80 | ((rune >> 12) & 0x3F);bytes[length++] = 0x80 | ((rune >> 6) & 0x3F);bytes[length++] = 0x80 | (rune & 0x3F);i++;continue;}}throw new Error('Malformed string');}}return bytes.subarray(0, length);}function toShortString(bytes, n) {var charCodes = new Array(n);var i = 0, off = 0;for (var len = bytes.length; i < n && off < len; i++) {var unit = bytes[off++];switch (unit >> 4) {case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:charCodes[i] = unit;break;case 12:case 13:if (off < len) {charCodes[i] = ((unit & 0x1F) << 6) |(bytes[off++] & 0x3F);}else {throw new Error('Unfinished UTF-8 octet sequence');}break;case 14:if (off + 1 < len) {charCodes[i] = ((unit & 0x0F) << 12) |((bytes[off++] & 0x3F) << 6) |(bytes[off++] & 0x3F);}else {throw new Error('Unfinished UTF-8 octet sequence');}break;case 15:if (off + 2 < len) {var rune = (((unit & 0x07) << 18) |((bytes[off++] & 0x3F) << 12) |((bytes[off++] & 0x3F) << 6) |(bytes[off++] & 0x3F)) - 0x10000;if (0 <= rune && rune <= 0xFFFFF) {charCodes[i++] = (((rune >> 10) & 0x03FF) | 0xD800);charCodes[i] = ((rune & 0x03FF) | 0xDC00);}else {throw new Error('Character outside valid Unicode range: 0x' + rune.toString(16));}}else {throw new Error('Unfinished UTF-8 octet sequence');}break;default:throw new Error('Bad UTF-8 encoding 0x' + unit.toString(16));}}if (i < n) {charCodes = charCodes.slice(0, i);}return String.fromCharCode.apply(String, charCodes);}function toLongString(bytes, n) {var buf = [];var charCodes = new Array(0xFFFF);var i = 0, off = 0;for (var len = bytes.length; i < n && off < len; i++) {var unit = bytes[off++];switch (unit >> 4) {case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:charCodes[i] = unit;break;case 12:case 13:if (off < len) {charCodes[i] = ((unit & 0x1F) << 6) |(bytes[off++] & 0x3F);}else {throw new Error('Unfinished UTF-8 octet sequence');}break;case 14:if (off + 1 < len) {charCodes[i] = ((unit & 0x0F) << 12) |((bytes[off++] & 0x3F) << 6) |(bytes[off++] & 0x3F);}else {throw new Error('Unfinished UTF-8 octet sequence');}break;case 15:if (off + 2 < len) {var rune = (((unit & 0x07) << 18) |((bytes[off++] & 0x3F) << 12) |((bytes[off++] & 0x3F) << 6) |(bytes[off++] & 0x3F)) - 0x10000;if (0 <= rune && rune <= 0xFFFFF) {charCodes[i++] = (((rune >> 10) & 0x03FF) | 0xD800);charCodes[i] = ((rune & 0x03FF) | 0xDC00);}else {throw new Error('Character outside valid Unicode range: 0x' + rune.toString(16));}}else {throw new Error('Unfinished UTF-8 octet sequence');}break;default:throw new Error('Bad UTF-8 encoding 0x' + unit.toString(16));}if (i >= 65534) {var size = i + 1;buf.push(String.fromCharCode.apply(String, charCodes.subarray(0, size)));n -= size;i = -1;}}if (i > 0) {buf.push(String.fromCharCode.apply(String, charCodes.slice(0, i)));}return buf.join('');}function toString(bytes) {var n = bytes.length;if (n === 0) return '';return ((n < 100000) ? toShortString(bytes, n) : toLongString(bytes, n));}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!