`
Liner
  • 浏览: 141215 次
  • 性别: Icon_minigender_1
  • 来自: 西南边陲
社区版块
存档分类
最新评论

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

阅读更多
续上一篇博文《几个文字加密的简洁算法和一些个人的想法》,不说开场白了,继续哦……

算法2:字符错位法
——相当于把一篇文章的字全部打乱随机重排。
(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);
    };
})();


用法:
<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 的阶乘)。


分享到:
评论
1 楼 szwx855 2011-02-02  
非常不错的加密算法。我收藏咯~~呵呵。

相关推荐

    PB下的加密解密的简单算法函数

    原理上对原字符串的每个字符做了数值转换,在加上加密因子,经过颠倒错位后再形成加密后数值,解密时再颠倒转换回来。 比较简单,现在用于对安全性要求不高的应用里。 原来发了一份,资源分不小心设高了。。呵呵,...

    c#通过DES加密算法加密大文件的方法

    首先,我们需要导入必要的命名空间,包括`System.IO`用于文件操作,`System.Security.Cryptography`用于加密算法,以及`System.Text`用于处理字符串。在代码中可以看到,`Default2`类是ASP.NET的一个Web表单页,其中...

    C语言经典算法100例.rar

    C语言的经典算法。 第一篇 基础与提高  实例1利用库函数编写基本显示程序  实例2变量属性  实例3运算符与类型  实例4关于程序结构  实例5显示函数曲线图  实例6二分法选代的应用  实例7多变的立方体  实例8...

    大数相乘算法解析,实现20位的大数相乘

    在计算机科学中,处理大数是常见的问题,尤其是在加密算法、数学计算或金融计算等领域。对于20位左右的大数相乘,我们可以通过设计特定的算法来高效地完成。这里介绍一种基于数组表示的大数相乘的方法。 首先,我们...

    易语言程序免安装版下载

    修改高级表格支持库,在双击单元格进入编辑状态后,不能收到第一个“字符输入”事件的BUG。 2. OpenGL支持库中的部分英文名称常量已改为中文,并统一在所有常量名称之前加前缀“GL_”,以减少与其它库的冲突机率。...

    VernamCipher:Vernam密码算法是一种流密码,它是对称的,并且使用布尔XOR函数将明文与相同长度的随机数据流组合在一起

    1. **唯一密钥**:每个明文字符都与一个不同的密钥字符进行异或,因此密钥必须是随机的、唯一的,且至少与明文一样长。如果密钥被重复使用,那么密码分析者可以通过比较不同消息的密钥部分来破解加密。 2. **完美...

    huoxingwen.rar_huoxingw_php 源码_php 火星语_火星文_火星源码

    1. `str_replace()`: 这个函数用于替换字符串中的特定字符,可以用于将普通文字替换为火星文。 2. `rand()`: 生成随机数,可用于随机选取词库中的火星文。 3. `explode()`: 将字符串分解为数组,方便对每个单词进行...

    Huantwofat之ACM模板库1

    在数论和加密算法中有着广泛应用。 2. **巴什博弈模板**:又称“猜数字游戏”,是博弈论的一个经典例子,玩家轮流猜测一个特定范围内的数字,通过对手的操作来推断正确答案。 3. **博弈论之Grungy数及sg函数**:在...

    前端大厂最新面试题-math.docx

    4. **将数组分成几个递增序列**:这可能涉及到动态规划和排序算法,需要理解如何根据数组的元素划分递增序列。 5. **凸多边形**:涉及平面几何,可能需要计算多边形的面积、周长,或者判断一个点是否在多边形内部。...

    数据结构大数相乘课程设计.pdf

    在计算机科学中,尤其是数据结构和算法领域,大数操作是重要的组成部分,尤其是在处理金融、加密或分布式计算等场景。 在大数相乘的课程设计中,主要分为以下几个步骤: 1. **输入阶段**:输入的大数被存储在一维...

    PDF转换成word转换器

    这个过程可能涉及到OCR(光学字符识别)技术,尤其是处理包含扫描图像的PDF时,OCR可以识别并转换图像中的文字。转换过程中,转换器会尽可能地保留原始PDF的布局和样式。 2. 应用场景: - 编辑需求:当用户需要修改...

    安卓面试题

    - **错位问题优化**:确保每个消息视图的宽度固定,并且使用LinearLayout的weight属性或者GridLayout等来保持界面的一致性。 #### 3. 视频、音频的上传 - **多媒体文件选择**:提供用户选择本地视频或音频文件的...

    教你设定计算机超强密码.docx

    6. **随机性和独特性**:使用无规律的字符组合,可以是单词的错位排列或者添加特殊符号。 7. **记忆技巧**:可以通过在密码中添加首尾符号,或者打乱单词顺序并插入数字来提高安全性,例如"$ideablue)"。 8. **...

    MTASA-encodeString-bug:encodeString和encodeString在奇数字节大小的情况下工作不正确

    1. 数据错位:编码后的字符串可能因为字节对齐问题,导致数据的错位,使得解码时无法恢复原始信息。 2. 解码失败:在解码过程中,由于字节长度不对称,可能导致解码函数无法正确识别和处理,进而抛出错误或返回无效...

    vivi万能小偷程序 小偷程序 vivi小偷程序 php小偷程序源码 网站采集系统

    ·全自动分析,内外链接自动转换、图片地址、css、js,自动分析CSS内的图片使得页面风格不丢失 ·广告标签,方便在规则里直接替换广告代码 ·支持自定义标签,标签可自定义内容、自由截取、内容正则截取。可以放在...

    关于PE可执行文件的修改.rar_PE修改_pe_pe文件修改

    7. **代码混淆**:为了防止反编译,开发者可能会对PE文件进行混淆处理,比如改变代码顺序、使用加密算法等。 8. **PE文件签名**:对于数字签名的PE文件,修改任何内容都会导致签名无效,需要重新签名以确保软件的信...

Global site tag (gtag.js) - Google Analytics