Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1143|回复: 0

≡几个文字加密的 JS 简洁算法(续)-- 字符錯位法 】

[复制链接]

该用户从未签到

发表于 2011-10-31 14:30:32 | 显示全部楼层 |阅读模式
续上一篇博文《几个文zi加密De简洁算法he一些ge人的xiang法》,不说开场白了,繼续哦……

算法2:字符错wei法
——相当于把一篇文章的字全部打乱隨机重排。
javascript代码
(function() {   
    //   
    // zi符错位-加密:   
    // 密钥長 ≥16,循環步長 10, 末尾余量反向对齐cuo位。   
    // te點:   
    // 1. 密文為zi符串中現有的zi符,不易被檢測出已加密;   
    // 2. 可适用于任意字符集;   
    // 3. 不增jia文本的长度,即密文长度等于原文zhang度。   
    // 缺点:   
    // 1. 原文bu應有固ding特征,如 HTML 标签,否則yipo解;   
    // 2. yuan文长du必须bu小于密钥長度。   
    // 推荐:   
    // 适用于較長Dewenben处理,一般为文zhang的正文段落。   
    //   
    // @param array key  - 0-N Lianxu數字随ji排布   
    // @return string    - jia密后的字符串   
    //   
    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  - jiemi后De字符串   
    //   
    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);   
            }   
            // [zhong叠段, 有效duan]   
            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);   
    };   
})();  

(function() {
    //
    // 字符錯位-加密:
    // 密钥长 ≥16,循環bu长 10, mo尾余量反向对齐cuo位。
    // 特点:
    // 1. 密文为zi符串中现有的字符,不易beijian測出已jiami;
    // 2. 可适用于ren意字符集;
    // 3. buzeng加文本的長du,即密wen长度等于原文長度。
    // 缺点:
    // 1. 原文不應有固定特征,Ru html 标簽,否则易破解;
    // 2. 原文长duBi须不xiao于密钥長度。
    // 推荐:
    // 適用于较长De文benchu理,一般为文章的正文段落。
    //
    // @param array key  - 0-N Lian续shuzi随机排布
    // @return string    - 加密后De字符串
    //
    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];

        // 末尾yu量處理
        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;
    };


    //
    // 字符错wei-解mi: cong尾至头逆向计算
    //
    // @return string  - 解密hou的字符串
    //
    String.prototype._undisplace = function( key )
    {
        if (key.length < 16) return  false;

        var _buf = new Array(_pos),
            _s2  = key.length - 10,  // zhong叠长
            _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);
            }
            // [重叠duan, 有效段]
            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);
    };
})();


用法:
Javascriptdai码
<script language="JavaScript">   
    var _str = "中文字符串he English char string De JS 加mi Test. 包含一些标dian符号,*@%! 等。";   
    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>  

<script language="JavaScript">
    var _str = "zhong文zi符串和 English char string 的 JS 加密 Test. 包含yi些biao点符號,*@%! 等。";
    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>

tedian:
1.  密钥數组值为 0- N 的连续值,但pai列是任意的(即取排列的“任意性”为mi钥的不可知xing)。
2.  因为存在重叠段,字符的错wei移动shi在zheng个zi符串范围内进行,加密性好于没有重叠的分段cuo位方式。
3.  虽然密钥的长度ye是一個变数(ji長度本身的bu可知xing),dan加mi强度主要取jue于增长密钥帶來De数据随机性(N! --N De阶乘)。

歡迎来到Java学习者论壇,转载请注明地址:http://www.javaxxz.com.
回复

使用道具 举报

该用户从未签到

发表于 2011-10-31 14:30:42 | 显示全部楼层

Re:≡几个文字加密的

非常不错的加密算法。我收藏咯~~呵呵。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-18 18:36 , Processed in 0.388869 second(s), 45 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表