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 相关文章推荐
一个可拖拽列宽表格实例演示
Nov 26 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
Jun 09 Javascript
用JavaScript实现对话框的教程
Jun 04 Javascript
基于JavaScript实现文字超出部分隐藏
Feb 29 Javascript
javascript鼠标跟随运动3种效果(眼球效果,苹果菜单,方向跟随)
Oct 27 Javascript
Asp.Net之JS生成分页条的方法
Nov 23 Javascript
JQuery实现动态操作表格
Jan 11 Javascript
如何正确理解javascript的模块化
Mar 02 Javascript
js的函数的按值传递参数(实例讲解)
Nov 16 Javascript
jQuery实现动态加载select下拉列表项功能示例
May 31 jQuery
Vue源码探究之状态初始化
Nov 14 Javascript
vue中使用router全局守卫实现页面拦截的示例
Oct 23 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
肝肠寸断了解下!盘点史上最伤心的十大动漫
2020/03/04 日漫
配置最新的PHP加MYSQL服务器
2006/10/09 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
推荐一本PHP程序猿都应该拜读的书
2014/12/31 PHP
PHP面向对象程序设计实例分析
2016/01/26 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
php实现的mysqldb读写分离操作类示例
2017/02/07 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
判断iframe里的页面是否加载完成
2014/06/06 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
Bootstrap 模态框实例插件案例分析
2016/12/28 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
浅谈js中function的参数默认值
2017/02/20 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
Vuex实现数据增加和删除功能
2019/11/11 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
Vue+Spring Boot简单用户登录(附Demo)
2020/11/12 Javascript
Python中的yield浅析
2014/06/16 Python
python中sets模块的用法实例
2014/09/30 Python
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
python实现读取大文件并逐行写入另外一个文件
2018/04/19 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
甜美蛋糕店创业计划书
2014/01/30 职场文书
追悼会主持词
2014/03/20 职场文书
文案策划求职信
2014/04/14 职场文书
读书伴我成长演讲稿
2014/05/07 职场文书
思品教学工作总结
2015/08/10 职场文书
创业计划书之熟食店
2019/10/16 职场文书
导游词之白茶谷九龙峡
2019/10/23 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技