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

一个类似 Base64 但真正实现了加密的 JS 文字加密算法

阅读更多
算法的基本原理和 Base64 类似。Base64 算法请参见维基百科 http://zh.wikipedia.org/zh-cn/Base64

这里把 Base64 中使用的基本字符表进行了随机化——即用基本字符表排列的随机性作为密钥的变化性。同时,考虑编码方法的应用环境多为 Javascript,故将 Base64 规范字符表中的 “+/=” 改成了 “$_~”,便于网络传输和变量命名等。

对 “纯单字节” 字符串或 “纯双字节” 字符串,密文的长度增长 0.35 倍左右;在单/双字节混合的字符串中,因为需要在 “单/双字节序列” 间插入标识码(状态指示),故密文的长度会有所加长,但也不会增加太多。

该加密法的密文长度增加量略低于 “进制乱序法”,加密强度约为 296 位(64 的阶乘),算法中没有加入 “平移” 的二次操作,如果嫌加密强度不够,可以简单的对密文进行平移操作(详见 http://rubel.iteye.com/blog/891657)。

算法的编写参考了 《base64的js实现》,在此致谢!(注:该算法中未对编码串作 76 字符分段)

算法 4: Base64 变形加密法

(function() {
    //
    // 密文字符集(size:65)。
    // [0-9A-Za-z$_~]
    //
    var _hexCHS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz$_~';

    //
    // Base64 变形加密法
    // 算法与 Base64 类似,即将 8 位字节用 6 位表示。
    // 规则:
    // 1. 码值 <= 0xff 的用 1 个字节表示;
    // 2. 码值 > 0xff 的用 2 字节表示;
    // 3. 单/双字节序列间用 0x1d 进行分隔;
    // 4. 首字为双字节时即前置 0x1d 分隔符。
    //
    // @param array key  - [0-63] 互斥值数组,length == 64
    // 
    Hex64 = function( key )
    {
        this._key = [], this._tbl = {};

        for (var _i=0; _i<64; ++_i) {
            this._key[_i] = _hexCHS.charAt(key[_i]);
            this._tbl[this._key[_i]] = _i;
        }

        this._pad = _hexCHS.charAt(64);
    };

    // 加密
    Hex64.prototype.enc = function( s )
    {
        var _rs = '';
        var _c1, _c2, _c3, _n1, _n2, _n3, _n4;
        var _i = 0;
        var _a = Hex64._2to1(s);
        var _en = _a.length % 3, _sz = _a.length - _en;
        while (_i < _sz) {
            _c1 = _a[_i++];
            _c2 = _a[_i++];
            _c3 = _a[_i++];
            _n1 = _c1 >> 2;
            _n2 = ((_c1 & 3) << 4) | (_c2 >> 4);
            _n3 = ((_c2 & 15) << 2) | (_c3 >> 6);
            _n4 = _c3 & 63;
            _rs += this._key[_n1]
                + this._key[_n2]
                + this._key[_n3]
                + this._key[_n4];
        }
        if (_en > 0) {
            _c1 = _a[_i++];
            _c2 = _en > 1 ? _a[_i] : 0;
            _n1 = _c1 >> 2;
            _n2 = ((_c1 & 3) << 4) | (_c2 >> 4);
            _n3 = (_c2 & 15) << 2;
            _rs += this._key[_n1] + this._key[_n2]
                + (_n3 ? this._key[_n3] : this._pad)
                + this._pad;
        }
        return  _rs.replace(/.{76}/g, function(s) {
            return  s + '\n';
        });
    };

    // 解密
    Hex64.prototype.dec = function( s )
    {
        var _sa = [],
            _n1, _n2, _n3, _n4,
            _i = 0, _c = 0;
        s = s.replace(/[^0-9A-Za-z$_~]/g, '');
        while (_i < s.length) {
            _n1 = this._tbl[s.charAt(_i++)];
            _n2 = this._tbl[s.charAt(_i++)];
            _n3 = this._tbl[s.charAt(_i++)];
            _n4 = this._tbl[s.charAt(_i++)];
            _sa[_c++] = (_n1 << 2) | (_n2 >> 4);
            _sa[_c++] = ((_n2 & 15) << 4) | (_n3 >> 2);
            _sa[_c++] = ((_n3 & 3) << 6) | _n4;
        }
        var _e2 = s.slice(-2);
        if (_e2.charAt(0) == this._pad) {
            _sa.length = _sa.length - 2;
        } else if (_e2.charAt(1) == this._pad) {
            _sa.length = _sa.length - 1;
        }
        return  Hex64._1to2(_sa);
    };

    //
    // 辅助:
    // Unicode 字符串 -> 单字节码值数组
    // 注意:
    // 原串中值为 0x1d 的字节(非字符)会被删除。
    //
    // @param string s  - 字符串(UCS-16)
    // @return array  - 单字节码值数组
    //
    Hex64._2to1 = function( s )
    {
        var _2b = false, _n = 0, _sa = [];

        if (s.charCodeAt(0) > 0xff) {
            _2b = true;
            _sa[_n++] = 0x1d;
        }
        for (var _i=0; _i<s.length; ++_i) {
            var _c = s.charCodeAt(_i);
            if (_c == 0x1d) continue;
            if (_c <= 0xff) {
                if (_2b) {
                    _sa[_n++] = 0x1d;
                    _2b = false;
                }
                _sa[_n++] = _c;
            } else {
                if (! _2b) {
                    _sa[_n++] = 0x1d;
                    _2b = true;
                }
                _sa[_n++] = _c >> 8;
                _sa[_n++] = _c & 0xff;
            }
        }
        return  _sa;
    };

    //
    // 辅助:
    // 单字节码值数组 -> Unicode 字符串
    //
    // @param array a  - 单字节码值数组
    // @return string  - 还原后的字符串(UCS-16)
    //
    Hex64._1to2 = function( a )
    {
        var _2b = false, _rs = '';

        for (var _i=0; _i<a.length; ++_i) {
            var _c = a[_i];
            if (_c == 0x1d) {
                _2b = !_2b;
                continue;
            }
            if (_2b) {
                _rs += String.fromCharCode(_c * 256 + a[++_i]); 
            } else {
                _rs += String.fromCharCode(_c);
            }
        }
        return  _rs;
    };

})();


用法:
<script language="JavaScript">
    var _str = "中文字符串和 English char string 的 JS 加密 1234. 包含一些标点符号,*@%! 等。";
    //php -r "$a=range(0,63); shuffle($a); echo join(',', $a);"
    var _k3 = [38,48,18,11,26,19,55,58,10,33,34,49,14,25,44,52,61,16,2,56,23,29,45,9,3,12,39,30,42,47,22,21,60,1,54,28,57,17,27,15,40,46,43,13,0,51,35,63,36,50,6,32,4,31,62,5,24,8,53,59,41,20,7,37];
    var _o = new Hex64(_k3);
    var _enc3 = _o.enc(_str);
    alert(_enc3)
    alert(_o.dec(_enc3));
    //wNOpC3lUT50RuSXNSm4yGj8FUtHWdImSdtJ6AwP4gRHZC6cllezlAQkuAmV2eJ_tw2coESE4nscl
    //NaTNY4Ocukpem5I8M6CuKbfEw2kcX2Qyw9pXEcA~


附件中:
xtools.js 里包含前面几篇文章中提及的几个文字加密算法(JS 版,稍有调整),以及 Window.name 跨域实现的代码;
其它几个文件为测试用的 html 文件。

分享到:
评论
1 楼 50980487 2011-02-17  
感谢分享,有时间研究研究...

相关推荐

    易语言Base64支持密码加密

    Base64字符集由大小写字母、数字以及"+"和"/"组成,末尾可能还需要添加一个等于号("=")进行填充。 在易语言中实现Base64编码,通常会使用到内置的字符串处理函数或第三方库。这些函数或库可以将任意字符串转换成...

    微信小程序base64加密,AES加密

    AES是一种对称加密算法,广泛应用于数据加密,确保数据在传输或存储时的安全。在微信小程序中,可能会用到AES来保护用户的敏感信息,如密码、身份验证令牌等。AES加密过程包括选择密钥、加密明文和解密密文三个步骤...

    base64的js实现

    base64的js实现 javascript实现base64加密算法

    js的base64加密解密

    在这个场景中,我们讨论的是一个纯JavaScript实现的Base64加密解密工具类,它无需依赖其他外部JavaScript库,因此非常适合在各种环境中使用,特别是对于那些对文件大小和加载速度有严格要求的项目。 Base64加密,也...

    Base64加密解密java/js

    因为是参照 js Base64写的java实现,所以代码可实现前台js,后台java的加密,解密的任意组合,当然也可自己简单改下参照序列顺序,使自己的加密解密变为独一的,网上无法使用工具解密出正确的数据。熟悉二进制的可...

    js实现的Base64的加密解密方法

    - 对于敏感数据,应当使用真正的加密算法,如AES,结合Base64编码,确保数据的安全性。 综上所述,`js实现的Base64的加密解密方法`涉及了Base64编码的基本原理,JavaScript中的内置API,自定义实现的必要性和应用...

    JS base64 加密解密

    为了解决这些问题,开发者通常会使用第三方库,如`base64-js`库,这是一个轻量级的JavaScript库,提供了更全面的Base64编码和解码功能,包括对Unicode字符串的支持。 例如,`base64-js`库中,你可以这样使用: ```...

    Base64加密算法java版

    Base64加密算法java版

    使用JS加密BASE64

    BASE64是一种常见的编码方式,它不是加密算法,但常用于在网络上传输二进制数据,因为HTTP协议和许多文本编辑器只能处理ASCII字符。在JavaScript(JS)环境中,我们可以轻松地实现BASE64的编码和解码功能。 标题...

    base64 加密插件(js)

    在这个"base64加密插件(js)"中,我们看到它是基于JavaScript实现的,这意味着它可以应用于Web前端,对数据进行加密处理,确保数据的安全性。 JavaScript是一种广泛使用的脚本语言,它在浏览器环境中运行,负责网页...

    js支持base64加密

    总的来说,JavaScript中的Base64编码是一个实用的工具,适用于多种场景,但必须谨慎处理,特别是在涉及到数据安全时。在实际开发中,选择合适的库和方法,确保代码的稳定性和兼容性,是至关重要的。

    js实现Md5 Base64 Sha256加密

    MD5、Base64和SHA-256是三种常见的加密算法,它们在JavaScript中都有对应的实现。 **MD5(Message-Digest Algorithm 5)** MD5是一种广泛使用的哈希函数,能够将任意长度的数据转化为固定长度的128位(16字节)摘要...

    Base64 加密算法

    了解了Base64编码的基本原理和应用场景后,我们可以使用各种编程语言(如Python、Java、JavaScript等)的库函数轻松实现Base64的编码和解码。在实际开发中,正确理解和使用Base64编码对于数据传输和存储至关重要。

    JS实现加密(base64, md5, sha1)

    常见的加密算法有Base64、MD5和SHA1。这些方法在不同的场景下有着各自的用途和特点。 1. **Base64编码**: Base64是一种用64个字符来表示任意二进制数据的方法。它不是一种加密方式,而是一种编码方式,主要用于在...

    JS实现密码加密(base64, md5, sha1)

    以上就是关于使用JavaScript实现Base64、MD5和SHA1密码加密的知识点,这些技术在Web开发中常用于数据安全和身份验证。但请记住,对于密码存储,应当优先考虑使用专门设计的密码哈希算法,以提供更好的安全保护。

    js加密算法3des和md5-base64和常用工具

    开发者可以利用JavaScript库,如crypto-js,来实现3DES、MD5和Base64的功能。这些库提供了简单的API接口,使得开发者能够轻松地进行加密和解密操作。 对于3DES,开发者需要指定一个密钥,然后调用对应的encrypt和...

    加密解密Base64的js封装代码

    本文将深入探讨Base64编码原理,JavaScript中的实现方式,以及如何封装一个Base64的加密解密工具。 Base64编码的基本原理是将每3个字节(24位)的数据拆分为4组,每组6位,然后将这6位二进制数据转换为其对应的...

    微信小程序base64加解密

    在微信小程序中,我们可能需要对敏感信息进行加密处理,Base64就成为了一个简单实用的工具。本篇将详细介绍微信小程序中的Base64加解密以及相关的使用方法。 Base64是一种基于64个可打印字符来表示二进制数据的编码...

    javascript的base64加密解密

    Base64编码将任何可打印的ASCII字符转换为一个由64个可打印字符组成的特定字符集,这64个字符包括大小写字母、数字和两个特殊符号`+`和`/`,并且通常在每76个字符后添加一个换行符,以便于邮件系统的处理。...

    base64加密解密源码(js)

    资源包中的"base64加密解密测试.html"文件很可能包含了一个完整的JavaScript Base64库,提供了自定义的Base64编解码功能。这个库可能包含了以下知识点: 1. **Base64编码**:讲解如何使用JavaScript进行Base64编码...

Global site tag (gtag.js) - Google Analytics