日期:2014-05-16 浏览次数:20471 次
(function() { // // 密文字符集(size:65)。 // [0-9A-Za-z$_~] // var _hexCHS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz$_~'; // // Base64 变形加密法 // 算法与 Base64 类似,即将 8 位字节用 6 位表示。 // 规则: // 1. 码值 <= 0xff 的用 1 个字节表示; // 2. 码值 > 0xff 的用 2 字节表示; // 3. 单/双字节序列间用 0x1d 进行分隔; // 4. 首字为双字节时即前置 0x1d 分隔符。 // // @param array key - [0-63] 互斥值数组,length == 64 // Hex64 = function( key ) { this._key = [], this._tbl = {}; for (var _i=0; _i<64; ++_i) { this._key[_i] = _hexCHS.charAt(key[_i]); this._tbl[this._key[_i]] = _i; } this._pad = _hexCHS.charAt(64); }; // 加密 Hex64.prototype.enc = function( s ) { var _rs = ''; var _c1, _c2, _c3, _n1, _n2, _n3, _n4; var _i = 0; var _a = Hex64._2to1(s); var _en = _a.length % 3, _sz = _a.length - _en; while (_i < _sz) { _c1 = _a[_i++]; _c2 = _a[_i++]; _c3 = _a[_i++]; _n1 = _c1 >> 2; _n2 = ((_c1 & 3) << 4) | (_c2 >> 4); _n3 = ((_c2 & 15) << 2) | (_c3 >> 6); _n4 = _c3 & 63; _rs += this._key[_n1] + this._key[_n2] + this._key[_n3] + this._key[_n4]; } if (_en > 0) { _c1 = _a[_i++]; _c2 = _en > 1 ? _a[_i] : 0; _n1 = _c1 >> 2; _n2 = ((_c1 & 3) << 4) | (_c2 >> 4); _n3 = (_c2 & 15) << 2; _rs += this._key[_n1] + this._key[_n2] + (_n3 ? this._key[_n3] : this._pad) + this._pad; } return _rs.replace(/.{76}/g, function(s) { return s + '\n'; }); }; // 解密 Hex64.prototype.dec = function( s ) { var _sa = [], _n1, _n2, _n3, _n4, _i = 0, _c = 0; s = s.replace(/[^0-9A-Za-z$_~]/g, ''); while (_i < s.length) { _n1 = this._tbl[s.charAt(_i++)]; _n2 = this._tbl[s.charAt(_i++)]; _n3 = this._tbl[s.charAt(_i++)]; _n4 = this._tbl[s.charAt(_i++)]; _sa[_c++] = (_n1 << 2) | (_n2 >> 4); _sa[_c++] = ((_n2 & 15) << 4) | (_n3 >> 2); _sa[_c++] = ((_n3 & 3) << 6) | _n4; } var _e2 = s.slice(-2); if (_e2.charAt(0) == this._pad) { _sa.length = _sa.length - 2; } else if (_e2.charAt(1) == this._pad) { _sa.length = _sa.length - 1; } return Hex64._1to2(_sa); }; // // 辅助: // Unicode 字符串 -> 单字节码值数组 // 注意: // 原串中值为 0x1d 的字节(非字符)会被删除。 // // @param string s - 字符串(UCS-16) // @return array - 单字节码值数组 // Hex64._2to1 = function( s ) { var _2b = false, _n = 0, _sa = []; if (s.charCodeAt(0) > 0xff) { _2b = true; _sa[_n++] = 0x1d; } for (var _i=0; _i<s.length; ++_i) { var _c = s.charCodeAt(_i); if (_c == 0x1d) continue; if (_c <= 0xff) { if (_2b) {