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 相关文章推荐
JS Range HTML文档/文字内容选中、库及应用介绍
May 12 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
Feb 02 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
Feb 27 Javascript
javascript学习笔记(八)正则表达式
Oct 08 Javascript
判断字符串的长度(优化版)中文占两个字符
Oct 30 Javascript
jQuery/CSS3图片特效插件整理推荐
Dec 07 Javascript
angular.js之路由的选择方法
Sep 24 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
Sep 29 Javascript
利用jsonp解决js读取本地json跨域的问题
Dec 11 Javascript
详解Vue.js v-for不支持IE9的解决方法
Dec 29 Javascript
koa router 多文件引入的方法示例
May 22 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
Mar 09 Javascript
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漏洞小结
2012/02/05 PHP
如何判断php数组的维度
2013/06/10 PHP
基于PHP制作验证码
2016/10/12 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
ajax 缓存 问题 requestheader
2010/08/01 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
JavaScript的==运算详解
2016/07/20 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
webpack4实现不同的导出类型
2019/04/09 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
2020/10/17 Javascript
python检测主机的连通性并记录到文件的实例
2018/06/21 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
python Django的web开发实例(入门)
2019/07/31 Python
python判断链表是否有环的实例代码
2020/01/31 Python
Django models filter筛选条件详解
2020/03/16 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
python适合做数据挖掘吗
2020/06/16 Python
Pandas之缺失数据的实现
2021/01/06 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
2021/01/29 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
大学生求职信
2014/06/17 职场文书
开除员工通知
2015/04/22 职场文书
HTML中的表单元素介绍
2022/02/28 HTML / CSS
win7配置本地ftp服务器的图文教程
2022/08/05 Servers