小甲鱼 发表于 2011-2-8 12:51:47

几个文字加密的 JS 简洁算法 -- 字符错位法

注:原帖来自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)
            returnfalse;

      var _pos = key.length, _buf = new Array(_pos);

      var _sect = function(s) {
            for (var _i=0; _i<key.length; ++_i) {
                _buf = s.charAt(key);
            }
            return[ _buf.slice(0, 10).join(''), _buf.slice(10).join('') ];
      };

      // _bs: back-string
      var _arr = _sect(this), _to = _arr, _bs = this.length - _pos;

      while (_bs >= 10) {
            _arr = _sect( _arr + this.substring(_pos, _pos + 10) );
            _pos += 10;
            _to += _arr;
            _bs = this.length - _pos;
      }
      _to += _arr;

      // 末尾余量处理
      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) returnfalse;

      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] = 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.slice(_pos - s.length);
                s = s.slice(0, -key.length) + _arr + _arr.slice(0, _pos - s.length);
            }
            _pos -= key.length;
            _arr = _sect(s.slice(_pos));
            _to = _arr + _to;
            _pos -= 10;
            while (_pos >= 0) {
                _arr = _sect( s.substring(_pos, _pos + 10) + _arr );
                _pos -= 10;
                _to = _arr + _to;
            }

            return_arr + _to;

      })(this);
    };
})();用法:

Javascript代码<script language="JavaScript">
    var _str = "中文字符串和 English char string 的 JS 加密 Test. 包含一些标点符号,*@%! 等。";
    var _k2 = ;
    var _enc2 = _str._displace(_k2);
    alert(_enc2);
    alert(_enc2._undisplace(_k2));
</script>特点:
1.密钥数组值为 0- N 的连续值,但排列是任意的(即取排列的“任意性”为密钥的不可知性)。
2.因为存在重叠段,字符的错位移动是在整个字符串范围内进行,加密性好于没有重叠的分段错位方式。
3.虽然密钥的长度也是一个变数(即长度本身的不可知性),但加密强度主要取决于增长密钥带来的数据随机性(N! --N 的阶乘)。

復襍 发表于 2013-9-19 10:59:54

随便看看,收藏丶东西,这是很好的习惯。
页: [1]
查看完整版本: 几个文字加密的 JS 简洁算法 -- 字符错位法