日期:2014-05-16 浏览次数:20553 次
(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);