| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
注:原帖来自Java eye : Liner  
 
算法2:字符错位法  
——相当于把一篇文章的字全部打乱随机重排。 
 
Javascript代码- (function() {
 
 -     //
 
 -     // 字符错位-加密:
 
 -     // 密钥长 ≥16,循环步长 10, 末尾余量反向对齐错位。
 
 -     // 特点:
 
 -     // 1. 密文为字符串中现有的字符,不易被检测出已加密;
 
 -     // 2. 可适用于任意字符集;
 
 -     // 3. 不增加文本的长度,即密文长度等于原文长度。
 
 -     // 缺点:
 
 -     // 1. 原文不应有固定特征,如 html 标签,否则易破解;
 
 -     // 2. 原文长度必须不小于密钥长度。
 
 -     // 推荐:
 
 -     // 适用于较长的文本处理,一般为文章的正文段落。
 
 -     //
 
 -     // @param array key  - 0-N 连续数字随机排布
 
 -     // @return string    - 加密后的字符串
 
 -     //
 
 -     String.prototype._displace = function( key )
 
 -     {
 
 -         if (key.length < 16 || this.length < key.length)
 
 -             return  false;
 
  
-         var _pos = key.length, _buf = new Array(_pos);
 
  
-         var _sect = function(s) {
 
 -             for (var _i=0; _i<key.length; ++_i) {
 
 -                 _buf[_i] = s.charAt(key[_i]);
 
 -             }
 
 -             return  [ _buf.slice(0, 10).join(''), _buf.slice(10).join('') ];
 
 -         };
 
  
-         // _bs: back-string
 
 -         var _arr = _sect(this), _to = _arr[0], _bs = this.length - _pos;
 
  
-         while (_bs >= 10) {
 
 -             _arr = _sect( _arr[1] + this.substring(_pos, _pos + 10) );
 
 -             _pos += 10;
 
 -             _to += _arr[0];
 
 -             _bs = this.length - _pos;
 
 -         }
 
 -         _to += _arr[1];
 
  
-         // 末尾余量处理
 
 -         if (_bs > 0) {
 
 -             var _ep = this.length - key.length;
 
 -             _arr = _sect(_to.substring(_ep) + this.substring(_pos));
 
 -             _to = _to.substring(0, _ep) + _arr.join('');
 
 -         }
 
  
-         return  _to;
 
 -     };
 
  
 
-     //
 
 -     // 字符错位-解密: 从尾至头逆向计算
 
 -     //
 
 -     // @return string  - 解密后的字符串
 
 -     //
 
 -     String.prototype._undisplace = function( key )
 
 -     {
 
 -         if (key.length < 16) return  false;
 
  
-         var _buf = new Array(_pos),
 
 -             _s2  = key.length - 10,  // 重叠长
 
 -             _pos = parseInt((this.length - key.length) / 10) * 10 + key.length;
 
  
-         var _sect = function(s) {
 
 -             for (var _i=0; _i<key.length; ++_i) {
 
 -                 _buf[key[_i]] = s.charAt(_i);
 
 -             }
 
 -             // [重叠段, 有效段]
 
 -             return  [ _buf.slice(0, _s2).join(''), _buf.slice(_s2).join('') ];
 
 -         };
 
  
-         return  (function(s) {
 
 -             var _to = '', _arr = null;
 
 -             // 末尾余量
 
 -             if (_pos < s.length) {
 
 -                 _arr = _sect(s.slice(-key.length));
 
 -                 _to = _arr[1].slice(_pos - s.length);
 
 -                 s = s.slice(0, -key.length) + _arr[0] + _arr[1].slice(0, _pos - s.length);
 
 -             }
 
 -             _pos -= key.length;
 
 -             _arr = _sect(s.slice(_pos));
 
 -             _to = _arr[1] + _to;
 
 -             _pos -= 10;
 
 -             while (_pos >= 0) {
 
 -                 _arr = _sect( s.substring(_pos, _pos + 10) + _arr[0] );
 
 -                 _pos -= 10;
 
 -                 _to = _arr[1] + _to;
 
 -             }
 
  
-             return  _arr[0] + _to;
 
  
-         })(this);
 
 -     };
 
 - })();
 
  复制代码 用法:  
 
Javascript代码- <script language="JavaScript">
 
 -     var _str = "中文字符串和 English char string 的 JS 加密 Test. 包含一些标点符号,*@%! 等。";
 
 -     var _k2 = [2,15,3,1,4,10,5,9,8,6,14,13,7,0,12,11];
 
 -     var _enc2 = _str._displace(_k2);
 
 -     alert(_enc2);
 
 -     alert(_enc2._undisplace(_k2));
 
 - </script>
 
  复制代码 特点:  
1.  密钥数组值为 0- N 的连续值,但排列是任意的(即取排列的“任意性”为密钥的不可知性)。  
2.  因为存在重叠段,字符的错位移动是在整个字符串范围内进行,加密性好于没有重叠的分段错位方式。  
3.  虽然密钥的长度也是一个变数(即长度本身的不可知性),但加密强度主要取决于增长密钥带来的数据随机性(N! --N 的阶乘)。 |   
 
 
 
 |