日期:2014-05-16 浏览次数:20451 次
(function() { // // 进制转换-加密: // 采用 [a-zA-Z] 52 个字符随机排列成进制表,对字符的值进行转换。 // 固定 3 位字符,41 进制,字符值最大可为 68920(> 65535)。 // 特点: // 1. 密文为纯大小写英文字母,及原有的 [\s\n\r]; // 2. 增加了平移操作,双重加密; // 3. key[0-40] 为进制表,逆向 16-25 位作为平移密钥; // 4. 进制表段字符不可重复。 // 5. 空白、换行和回车 [\s\n\r] 不加密。 // 缺点: // 密文会比原文长,单字节字符会增长得较多。 // 推荐: // 适用于任意类型的文本加密,网络环境可采用压缩传输; // 注意: // key 字符串不能含非 [a-zA-Z] 字符(关联数组)。 // // @param string key - 进制表串(length >= 41) // @return string - 转换后的字符串 // String.prototype._41hex = (function() { var _k, _k2, _sz; return function( key ) { if (key.length < 41) return null; if (_k != key) { _sz = key.charCodeAt(40) % 10 + 16, _k2 = key.slice(-_sz).split(''); for (var _i=0; _i<_sz; ++_i) { _k2[_i] = _k2[_i].charCodeAt(0); } _k = key; } var _cnt = 0; return this.replace(/[^\s\n\r]/g, function(s) { var _n = s.charCodeAt(0); return key.charAt(parseInt(_n/1681)) + key.charAt(parseInt(_n%1681/41)) + key.charAt(_n%41); }).replace(/[a-zA-Z]/g, function(s) { var _n = s.charCodeAt(0), _beg = (_n < 0x61) ? 0x41 : 0x61, _c = _n - _beg; return String.fromCharCode((_c+_k2[_cnt++%_sz])%26 + _beg); }); }; })(); // // 进制转换-解密 // @return string - 恢复后的字符串 // String.prototype._un41hex = (function() { var _k, _k2 = [], _sz, _tbl = {}; return function( key ) { if (key.length < 41) return null; if (_k != key) { // 逆向,防止属性值覆盖 for (var _i=key.length-1; _i>=0; --_i) { _tbl[key.charAt(_i)] = _i; _k2[_i] = key.charCodeAt(_i); } _sz = _k2[40] % 10 + 16; _k2 = _k2.slice(-_sz); _k = key; } var _cnt = 0; return this.replace(/[a-zA-Z]/g, function(s) { var _n = s.charCodeAt(0), _beg = (_n < 0x61) ? 0x41 : 0x61, _c = _n - _beg; return String.fromCharCode((_c-_k2[_cnt++%_sz]%26+26)%26 + _beg); }).replace(/[a-zA-Z]{3}/g, function(s) { var _n = _tbl[s.charAt(0)]*1681 + _tbl[s.charAt(1)]*41 + _tbl[s.charAt(2)]; return String.fromCharCode(_n);