JavaScript实现SHA-1加密算法的方法


Posted in Javascript onMarch 11, 2015

本文实例讲述了JavaScript实现SHA-1加密算法的方法。分享给大家供大家参考。具体实现方法如下:

调用方法:hex_sha1即可。

/*

 *

 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined

 * in FIPS PUB 180-1

 *

 * By lizq

 *

 * 2006-11-11

 *

 */

/*

 *

 * Configurable variables.

 *

 */

var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */

var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */

/*

 *

 * The main function to calculate message digest

 *

 */

function hex_sha1(s){

    return binb2hex(core_sha1(AlignSHA1(s)));

}

/*

 *

 * Perform a simple self-test to see if the VM is working

 *

 */

function sha1_vm_test(){

    return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";

}

/*

 *

 * Calculate the SHA-1 of an array of big-endian words, and a bit length

 *

 */

function core_sha1(blockArray){

    var x = blockArray; // append padding

    var w = Array(80);

    var a = 1732584193;

    var b = -271733879;

    var c = -1732584194;

    var d = 271733878;

    var e = -1009589776;

    for (var i = 0; i < x.length; i += 16) // 每次处理512位 16*32

    {

        var olda = a;

        var oldb = b;

        var oldc = c;

        var oldd = d;

        var olde = e;

        for (var j = 0; j < 80; j++) // 对每个512位进行80步操作

        {

            if (j < 16) 

                w[j] = x[i + j];

            else

                w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);

            var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j)));

            e = d;

            d = c;

            c = rol(b, 30);

            b = a;

            a = t;

        }

        a = safe_add(a, olda);

        b = safe_add(b, oldb);

        c = safe_add(c, oldc);

        d = safe_add(d, oldd);

        e = safe_add(e, olde);

    }

    return new Array(a, b, c, d, e);

}

/*

 *

 * Perform the appropriate triplet combination function for the current

 * iteration

 *

 * 返回对应F函数的值

 *

 */

function sha1_ft(t, b, c, d){

    if (t < 20) 

        return (b & c) | ((~ b) & d);

    if (t < 40) 

        return b ^ c ^ d;

    if (t < 60) 

        return (b & c) | (b & d) | (c & d);

    return b ^ c ^ d; // t<80

}

/*

 *

 * Determine the appropriate additive constant for the current iteration

 *

 * 返回对应的Kt值

 *

 */

function sha1_kt(t){

    return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514;

}

/*

 *

 * Add integers, wrapping at 2^32. This uses 16-bit operations internally

 *

 * to work around bugs in some JS interpreters.

 *

 * 将32位数拆成高16位和低16位分别进行相加,从而实现 MOD 2^32 的加法

 *

 */

function safe_add(x, y){

    var lsw = (x & 0xFFFF) + (y & 0xFFFF);

    var msw = (x >> 16) + (y >> 16) + (lsw >> 16);

    return (msw << 16) | (lsw & 0xFFFF);

}

/*

 *

 * Bitwise rotate a 32-bit number to the left.

 *

 * 32位二进制数循环左移

 *

 */

function rol(num, cnt){

    return (num << cnt) | (num >>> (32 - cnt));

}

/*

 *

 * The standard SHA1 needs the input string to fit into a block

 *

 * This function align the input string to meet the requirement

 *

 */

function AlignSHA1(str){

    var nblk = ((str.length + 8) >> 6) + 1, blks = new Array(nblk * 16);

    for (var i = 0; i < nblk * 16; i++) 

        blks[i] = 0;

    for (i = 0; i < str.length; i++) 

        blks[i >> 2] |= str.charCodeAt(i) << (24 - (i & 3) * 8);

    blks[i >> 2] |= 0x80 << (24 - (i & 3) * 8);

    blks[nblk * 16 - 1] = str.length * 8;

    return blks;

}

/*

 *

 * Convert an array of big-endian words to a hex string.

 *

 */

function binb2hex(binarray){

    var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";

    var str = "";

    for (var i = 0; i < binarray.length * 4; i++) {

        str += hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) +

        hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF);

    }

    return str;

}

/*

 *

 * calculate MessageDigest accord to source message that inputted

 *

 */

function calcDigest(){

    var digestM = hex_sha1(document.SHAForm.SourceMessage.value);

    document.SHAForm.MessageDigest.value = digestM;

}

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
jQuery Autocomplete自动完成插件
Jul 17 Javascript
JS与C#编码解码
Dec 03 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
Dec 31 Javascript
jQuery实现简单的日期输入格式化控件
Mar 12 Javascript
jQuery实现左右切换焦点图
Apr 03 Javascript
JS模态窗口返回值兼容问题的完美解决方法
May 28 Javascript
jQuery实现div跟随鼠标移动
Aug 20 jQuery
ComboBox(下拉列表框)通过url加载调用远程数据的方法
Aug 06 Javascript
浅谈js闭包理解
Apr 01 Javascript
JS中封装axios来管控api的2种方式
Sep 11 Javascript
vue实现购物车结算功能
Jun 18 Javascript
vue+vant 上传图片需要注意的地方
Jan 03 Vue.js
JavaScript前补零操作实例
Mar 11 #Javascript
JavaScript限定图片显示大小的方法
Mar 11 #Javascript
iScroll中事件点击触发两次解决方案
Mar 11 #Javascript
node-webkit打包成exe文件被360误报木马的解决方法
Mar 11 #Javascript
javascript结合Canvas 实现简易的圆形时钟
Mar 11 #Javascript
解决node-webkit 不支持html5播放mp4视频的方法
Mar 11 #Javascript
javascript与css3动画结合使用小结
Mar 11 #Javascript
You might like
php 无法加载mysql的module的时候的配置的解决方案引发的思考
2012/01/27 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
PHP中执行cmd命令的方法
2014/10/11 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
js 加载时自动调整图片大小
2008/05/28 Javascript
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
javascript setTimeout和setInterval计时的区别详解
2013/06/21 Javascript
javascript简单事件处理和with用法介绍
2013/09/16 Javascript
原生JavaScript生成GUID的实现示例
2014/09/05 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
JS中的==运算: [''] == false —&gt;true
2016/07/24 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
微信小程序组件传值图示过程详解
2019/07/31 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
初学Python函数的笔记整理
2015/04/07 Python
python requests 使用快速入门
2017/08/31 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
python统计中文字符数量的两种方法
2019/01/31 Python
使用Python快速制作可视化报表的方法
2019/02/03 Python
浅析Python 读取图像文件的性能对比
2019/03/07 Python
详解pandas赋值失败问题解决
2020/11/29 Python
俄罗斯玩具、儿童用品、儿童服装和鞋子网上商店:MyToys.ru
2019/10/14 全球购物
应届毕业生如何写求职信
2014/02/16 职场文书
新闻传播专业求职信
2014/07/22 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
《悬崖边的树》读后感2篇
2019/12/02 职场文书
CSS的calc函数用法小结
2022/06/25 HTML / CSS